头痛的问题,怎样行列互换?(200分)

  • 主题发起人 主题发起人 leijh001
  • 开始时间 开始时间
L

leijh001

Unregistered / Unconfirmed
GUEST, unregistred user!
原内容:
fields ubiaohao jianyandian wucha jielun
1111111 a600 0.12 T
1111111 a400 0.32 T
1111111 a300 0.52 T
1111111 a200 0.22 T
1111111 a100 -0.22 T
1111111 a050 0.72 T
1111111 a020 0.92 T
1111112 a600 0.12 T
1111112 a400 0.32 T
1111112 a300 0.52 T
1111112 a200 0.22 T
1111112 a100 -0.22 T
1111112 a050 0.72 T
1111112 a020 0.92 T
... ... ... ...
目标:
fields ubiaohao a600 a400 a300 a200 a100 a050 a020 jielun
1111111 0.12 0.32 0.52 0.22 -0.22 0.72 0.92 T
1111112 0.12 0.32 0.52 0.22 -0.22 0.72 0.92 T
...
所有的字段都是字符型,其中jianyandian的内容是不定的,但在某个条件下是不变的,请教各位,如何实现动态转换?
 
这个呀,利用字段操作吧,换成个新表
以前做自动填图卡数据转换时要到类似情况
 
不怕麻烦自己写个数组转换
走捷径决策控件(DELPHI3就有了,不过用的人不多)可能帮你的忙
 
建议你去看数据结构,上面可是讲的非常清楚啊。
 
這個呀,你可以用代碼實現呀,用遊標可以搞定
先從表中查出jianyandian 對應到遊標中
select distinct jianyandian
from table
用遊標動態生成sql查詢語句,sql語句是字符串就可以了如 set sql=sql+dysql
最後 exe (sql)就可以了
具體sql怎樣生成,用
select ubiaohao ,jielun,
isnull(sum(case then
end))
from table
where condition
group by ***
注:isnull(sum(case then
end))這一塊動態生成就可以了
明白了嗎
 
fxjpost真正理解了我的意思,但我对你说的还是一知半解,isnull(sum(case then
end))这句不知是什么意思,干脆把实现的代码都帮我写出来,谢啦!
 
注 : 我把WUCHA字段改成了NUMERIC(18,6)才通过,否则在求和时报错
另外我是在SQLSERVER下调试通过的
仅供参考
DECLARE @SQLString NVARCHAR(4000),
@jianyandian varchar(10)
declare curjianyandian cursor for select distinct jianyandan from t1 order by jianyandan
open curjianyandian
fetch next from curjianyandian into @jianyandian
select @SQLString = 'select T1.* into #jyd from ('
select @SQLString = @SQLString + ' select ubiaohao'
while @@FETCH_STATUS = 0
begin
select @SQLString = @SQLString + ',sum(case when jianyandan=''' + @jianyandian + ''' then
wucha else
0 end) ['+@jianyandian+']'
fetch next from curjianyandian into @jianyandian
end
close curjianyandian
deallocate curjianyandian
select @SQLString = @SQLString +',jielun from t1 group by ubiaohao,jielun) T1'
select @SQLString = @SQLString +' select * from #jyd'
EXECUTE sp_executesql @SQLString
if OBJECT_ID('tempdb..#jyd') IS NOT NULL
drop table #jyd
 
to Tom Hacker:
你能在SQLSERVER下调试通过,真是佩服,你应该是数据库高手吧?!
我向你请教,这段代码如何在SQLSERVER中调试。(我只知道SQLSERVER知识的有限皮毛)
 
用两个QUERY也同样能实现的,原理同Tom Hacker
你的数据库最好是比较先进一点的数据库象SQLSERVER,ORACLE才向
 
我的数据库是SQLSERVER,按照Tom Hacker的做法我已在SQLSERVER query analyzer调试过啦,错误提示如Tom Hacker所说的,要把wucha字段改成数字型 ,数据库格式是不能更改的呀,如何做呢?
to plane822:你能帮我用两个QUERY实现Tom Hacker的做法吗?
 
to leijh001
因为是动态拼写的sql语句,所以我在查询分析器中是用了print @sqlstring
将sql语句打出来检查的
另外我用了t-sql的sp_executesql执行的
因此说是在sqlserver下调试通过
 
将求和部分加入convert将数据做一次转换即可,如果你用的是sqlserver可将其做成
存储过程即可
DECLARE @SQLString NVARCHAR(4000),
@jianyandian varchar(10)
declare curjianyandian cursor for select distinct jianyandan from t1 order by jianyandan
open curjianyandian
fetch next from curjianyandian into @jianyandian
select @SQLString = 'select T1.* into #jyd from ('
select @SQLString = @SQLString + ' select ubiaohao'
while @@FETCH_STATUS = 0
begin
select @SQLString = @SQLString + ',sum(case when jianyandan=''' + @jianyandian + ''' then
convert(numeric(18,6),wucha) else
0 end) ['+@jianyandian+']'
fetch next from curjianyandian into @jianyandian
end
close curjianyandian
deallocate curjianyandian
select @SQLString = @SQLString +',jielun from t1 group by ubiaohao,jielun) T1'
select @SQLString = @SQLString +' select * from #jyd'
EXECUTE sp_executesql @SQLString
if OBJECT_ID('tempdb..#jyd') IS NOT NULL
drop table #jyd
 
非常感谢各位,经各位指点,问题已解决,结贴!
 
多人接受答案了。
 
后退
顶部