动态行列转换:
1、一行对应多列需要转换,应该怎么解决?
2、动态行列转换时,动态列名能不能变动?
表1,table1:ID NO order content1 content2 content3 content4
1 1 a s1 s2 a3 a4
2 2 a df df2 df3 dw4
3 3 a g2 g3 gg gh
4 1 b a a r2 r3
5 2 b d3 d d d
..............想把table1转换成如下格式:
order content11 content12 content13 content21 content22 content23 content31 content32.....
a s1 df g2 s2 df2 g3 a3 df3
b .....这个问题困饶我好几天了,没有做出来,网上也没有找到这样的事例,请各位朋友帮忙解决
1、一行对应多列需要转换,应该怎么解决?
2、动态行列转换时,动态列名能不能变动?
表1,table1:ID NO order content1 content2 content3 content4
1 1 a s1 s2 a3 a4
2 2 a df df2 df3 dw4
3 3 a g2 g3 gg gh
4 1 b a a r2 r3
5 2 b d3 d d d
..............想把table1转换成如下格式:
order content11 content12 content13 content21 content22 content23 content31 content32.....
a s1 df g2 s2 df2 g3 a3 df3
b .....这个问题困饶我好几天了,没有做出来,网上也没有找到这样的事例,请各位朋友帮忙解决
解决方案 »
- 服务器维护方面的经验,请提供一些金玉良言,谢谢!!!
- VS2005实现团队开发需要安装什么组件?
- dropdownlist与viewstate的关系怎样的?
- 再求repeater的分页
- 有无这种示例,给出SQL查询语句,自动生成列表显示、新增、修改、删除的ASP.NET(C#)的应用程序。
- 请问如何用ASP.NET服务器代码得到Javascript里的变量值.再用标签框显示出来
- 请教个关于工作流定制的严重问题。
- 获取客户端的IP为什么获得的都是服务器的IP?
- 用vs.net创建一个控制台应用程序class1.cs 和 class2.cs 出错:定义了不止一个入口点
- cookies的删除问题
- <%#Eval("Img").ToString() != "" ? <img src="UploadFiles/Link_Img/Eval("Img")"/>
- 回发或回调参数无效
create table tb(ID int,[NO] int, [order] varchar(10), content1 varchar(10), content2 varchar(10),content3 varchar(10),content4 varchar(10))
insert into tb select
1,1,'a','s1','s2 ','a3 ','a4 ' union all select
2,2,'a','df','df2','df3','dw4' union all select
3,3,'a','g2','g3 ','gg ','gh ' union all select
4,1,'b','a ','a ','r2 ','r3 ' union all select
5,2,'b','d3','d ','d ','d ' declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+'[content1'+cast([NO ]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then content1 else null end),'
+'[content2'+cast([NO ]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then content2 else null end),'
+'[content3'+cast([NO ]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then content3 else null end),'
+'[content4'+cast([NO ]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then content4 else null end)'
from tb group by [NO]
exec('select [order] '+@s+' from tb group by [Order]')/*
order content11 content21 content31 content41 content12 content22 content32 content42 content13 content23 content33 content43
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
a s1 s2 a3 a4 df df2 df3 dw4 g2 g3 gg gh
b a a r2 r3 d3 d d d NULL NULL NULL NULL警告: 聚合或其它 SET 操作消除了空值。*/drop table tb
我更换语句中的表名和字段后,现运行就出现错误如下:
[color=#FF0000]消息 4145,级别 15,状态 1,第 1 行
在应使用条件的上下文(在 'N from ODURdata group by [sn' 附近)中指定了非布尔类型的表达式。[/color]不知是什么问题???
还有一个问题,如上表,在没有转换之前,表里面有相同NO的行,但转换时,如有相同的NO的行,只转换ID值最大的那个(相同NO的最后一个)
如何实现操作,应在4楼程序中加入什么语句,能实现我的要求??
50 8 O2009050010 12 Fail 1 1 2009-5-25
51 1 O2009050010 12 Pass 0 2009-5-25
52 2 O2009050010 12 Pass 1 2009-5-25
53 3 O2009050010 12 Fail -77 1 2009-5-25
54 7 O2009050010 12 Fail 0 1 2009-5-25
55 8 O2009050010 12 Pass 10 -9 2009-5-25
56 1 O2009050010 12 Fail 3 Pass 1 2009-5-25
57 2 O2009050010 12 Pass 1 Fail 4 2009-5-25
61 1 O2009050010 12 Pass 1 2009-5-25
62 2 O2009050010 12 Pass 2 2009-5-25
63 3 O2009050010 12 Fail 1 2009-5-25
64 7 O2009050010 12 Fail 2 2009-5-25
65 8 O2009050010 12 Fail 1 2009-5-25
58 3 O2009050010 12 Pass -77 Fail 14 2009-5-25
59 7 O2009050010 12 Fail 01 Fail 1 2009-5-25
60 8 O2009050010 12 Fail 1 Fail 2 2009-5-25
66 9 O2009050010 12 Fail 1 2009-5-25
67 10 O2009050010 12 Fail 12 2009-5-25
68 11 O2009050010 12 Fail 12 2009-5-25
69 12 O2009050010 12 Fail 12 2009-5-25
70 16 O2009050010 12 Fail 12 2009-5-25
71 17 O2009050010 12 Pass 1 2009-5-25
72 18 O2009050010 12 Pass 1 2009-5-25
73 19 O2009050010 12 Fail 12 2009-5-25
74 20 O2009050010 12 Pass 2 2009-5-25
75 21 O2009050010 12 Pass 2 2009-5-25
76 22 O2009050010 12 Pass 4 2009-5-25
77 23 O2009050010 12 Pass 4 2009-5-25
78 24 O2009050010 12 Fail 1 2009-5-25
79 4 O2009050010 12 Pass -60 2009-5-25
80 5 O2009050010 12 Fail 3 2009-5-25
81 6 O2009050010 12 Fail 34 2009-5-25
82 13 O2009050010 12 Pass 19 Fail 34 Fail 13 2009-5-25
83 14 O2009050010 12 Fail 4 Fail 3 Fail 4 2009-5-25
84 15 O2009050010 12 Fail 4 Fail 14 2009-5-25
85 25 O2009050010 BLB07090077 Pass 3 2009-5-25
103 25 O2009050014 BLB07090088 Pass 1 2009-6-2
104 25 O2009050014 BLB07090088 Pass 1 2009-6-2
105 9 O2009050014 BLB07090088 Fail 1 2009-6-2
106 10 O2009050014 BLB07090088 Fail 1 2009-6-2
107 11 O2009050014 BLB07090088 Fail 1 2009-6-2
108 12 O2009050014 BLB07090088 Fail 1 2009-6-2
152 25 O2009050014 BLB07090088 Pass 3 2009-6-2
153 9 O2009050014 BLB07090088 Fail 1 2009-6-2
154 10 O2009050014 BLB07090088 Fail 2 2009-6-2
155 11 O2009050014 BLB07090088 Fail 2 2009-6-2
156 12 O2009050014 BLB07090088 Fail 21 2009-6-2
157 16 O2009050014 BLB07090088 Pass 2 2009-6-2
158 17 O2009050014 BLB07090088 Pass 2 2009-6-2
159 18 O2009050014 BLB07090088 Pass 2 2009-6-2
160 19 O2009050014 BLB07090088 Pass 2 2009-6-2
161 20 O2009050014 BLB07090088 Pass 2 2009-6-2
162 21 O2009050014 BLB07090088 Pass 2 2009-6-2
163 22 O2009050014 BLB07090088 Pass 2 2009-6-2
164 23 O2009050014 BLB07090088 Pass 2 2009-6-2
165 24 O2009050014 BLB07090088 Fail 2 2009-6-2
166 4 O2009050014 BLB07090088 Fail 1 2009-6-2
167 5 O2009050014 BLB07090088 Fail 1 2009-6-2
168 6 O2009050014 BLB07090088 Fail 1 2009-6-2
169 13 O2009050014 BLB07090088 Fail 1 Fail 1 Fail 1 2009-6-2
170 14 O2009050014 BLB07090088 Fail 1 Fail 1 Fail 1 2009-6-2
171 15 O2009050014 BLB07090088 Pass 1 Pass 1 Pass 1 2009-6-2
ID NO sn Lstate low Mstate mid Hstate high date
1 1 12 1 1
2 2 12 1 1
3 3 12 1 1
4 7 12 2 2
5 8 12 2 2
6 1 12 2 2
7 2 12 2 2
9 7 12 2 2
10 8 12 2 2
11 1 12 1 1
12 2 12 2 2
13 3 12 2 1
14 7 12 12 12
15 8 12 12 12
16 1 13 1 1
17 2 13 1 1
18 3 13 1 1
19 7 13 1 1
20 8 13 1 1
create table tb(ID int,NO int,sn int,Lstate int,low int)
insert into tb select
1 ,1,12,1 ,1 union all select
2 ,2,12,1 ,1 union all select
3 ,3,12,1 ,1 union all select
4 ,7,12,2 ,2 union all select
5 ,8,12,2 ,2 union all select
6 ,1,12,2 ,2 union all select
7 ,2,12,2 ,2 union all select
9 ,7,12,2 ,2 union all select
10,8,12,2 ,2 union all select
11,1,12,1 ,1 union all select
12,2,12,2 ,2 union all select
13,3,12,2 ,1 union all select
14,7,12,12,12 union all select
15,8,12,12,12 union all select
16,1,13,1 ,1 union all select
17,2,13,1 ,1 union all select
18,3,13,1 ,1 union all select
19,7,13,1 ,1 union all select
20,8,13,1 ,1 declare @s nvarchar(4000)
set @s=''
Select @s=@s+','
+'[sn'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then sn else null end),'
+'[Lstate'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then Lstate else null end),'
+'[low'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then [low] else null end)'
from tb group by [NO]
exec('select [NO] '+@s+' from tb group by [NO]')/*
NO sn1 Lstate1 low1 sn2 Lstate2 low2 sn3 Lstate3 low3 sn7 Lstate7 low7 sn8 Lstate8 low8
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
1 13 2 2 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
2 NULL NULL NULL 13 2 2 NULL NULL NULL NULL NULL NULL NULL NULL NULL
3 NULL NULL NULL NULL NULL NULL 13 2 1 NULL NULL NULL NULL NULL NULL
7 NULL NULL NULL NULL NULL NULL NULL NULL NULL 13 12 12 NULL NULL NULL
8 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 13 12 12
*/drop table tb
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','
+'[sn'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then sn else null end),'
+'[Lstate'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then Lstate else null end),'
+'[low'+cast([NO]as varchar(10))+']=max(case when [NO]='+quotename([NO],'''')+' then [low] else null end)'
from (select * from tb where id in (select max(id) from odurdata group by sn,NO) ) as data group by [NO]
exec('select [sn] '+@s+' from (select * from tb where id in (select max(id) from odurdata group by sn,NO) ) as data group by [sn]')在此感谢各位网友对我问题的回答和帮助,我要特别感谢jiangshun 这位网友,是他帮我解决了这个问题。
不过我也要对jiangshun说声对不起,因为我没有可用‘分’给你。实在很抱歉。