动态行转列问题

shuohuameijiang 2012-01-04 08:59:19
有表 #1 ,数据如下:
rkey ,PN ,nums ,rkey1

215 ,MP4-2642-1 ,30 ,62
273 ,FE2-2664-1 ,432 ,1
594 ,FS2-2708-1 ,20 ,370
632 ,TE4-2718-1 ,48 ,28
788 ,FE4-1376-1A ,200 ,28
1466 ,AFE4-1975-1A ,380 ,28
.......

我要的结果:
rkey ,PN ,62 ,1 ,370 ,28 .....

215 ,MP4-2642-1 ,30 ,0 ,0 ,0
273 ,FE2-2664-1 ,0 ,432 ,0 ,0
594 ,FS2-2708-1 ,0 ,0 ,20 ,0
632 ,TE4-2718-1 ,0 ,0 ,0 ,48
788 ,FE4-1376-1A ,0 ,0 ,0 ,200
1466 ,AFE4-1975-1A ,0 ,0 ,0 ,380
=================
下面是我写的SQL语句,但总报错:
[消息 245,级别 16,状态 1,第 4 行
在将 varchar 值 ' then nums else 0 end) as ' 转换成数据类型 int 时失败。]

declare @sql varchar(8000)
select @sql='select top 100 percent #1.rkey,#1.PN'
select @sql=@sql+
',max(case rkey1 when '+ rkey1 +' then [nums] else 0 end) as '+ convert(varchar(10),rkey1)
from #1
group by #1.rkey1
select @sql=@sql+' from #1 group by #1.rkey,#1.PN,#1.rkey1 '

注意:rkey,nums,rkey1 都是int 型。
...全文
128 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuohuameijiang 2012-01-05
  • 打赏
  • 举报
回复
你给的只是第一步将行转为动态列。
我希望第二步 :将动态生成的列进行分类汇总。也能是动态进行的。

也就是说,第一步今天可能生成62,1两列,但明天 可能减少了一列,又同时增多了一列:1,3,54.

我想把这些未知的不确定的列动态分类汇总。这样能做到吗?
dawugui 2012-01-05
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
select @sql='select top 100 percent #1.rkey,#1.PN'
select @sql=@sql+
',max(case rkey1 when '+ cast(rkey1 as varchar) +' then [nums] else 0 end) as '+ convert(varchar(10),rkey1)
from #1
group by #1.rkey1
select @sql=@sql+' from #1 group by #1.rkey,#1.PN,#1.rkey1 '
shuohuameijiang 2012-01-05
  • 打赏
  • 举报
回复

补充下:
rkey1 的值是动态的。
比如:值是(62,1,370,28)时,应该这样表示:
rkey ,PN ,62 ,1 ,370 ,28
215 ,MP4-2642-1 ,30 ,0 ,0 ,0
273 ,FE2-2664-1 ,0 ,432 ,0 ,0
594 ,FS2-2708-1 ,0 ,0 ,20 ,0
632 ,TE4-2718-1 ,0 ,0 ,0 ,48
788 ,FE4-1376-1A ,0 ,0 ,0 ,200
1466 ,AFE4-1975-1A ,0 ,0 ,0 ,380
1466 ,AFE4-1975-1A ,0 ,0 ,0 ,20
rkey1 值是(62,1)时,应该这样表示:
rkey ,PN ,62 ,1
215 ,MP4-2642-1 ,30 ,0


然后,还要能够动态汇总:按上面的第1个例子,汇总后是:

rkey ,PN ,62 ,1 ,370 ,28
215 ,MP4-2642-1 ,30 ,0 ,0 ,0
273 ,FE2-2664-1 ,0 ,432 ,0 ,0
594 ,FS2-2708-1 ,0 ,0 ,20 ,0
632 ,TE4-2718-1 ,0 ,0 ,0 ,48
788 ,FE4-1376-1A ,0 ,0 ,0 ,200
1466 ,AFE4-1975-1A ,0 ,0 ,0 ,400

注意:因为行转列生成的新列是动态的,所以有可能这次生成4列,下次生成6列,第三次只生成2列。
这样,在进行分类汇总的时候,对应的列也是时刻变动的。请问这样如何实现?

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧