行转列的问题???? !!!!!!!!!!!!! 请大侠们快帮帮忙呀 在线等!!!!

itymx 2008-06-28 10:47:35

行转列的问题???? !!!!!!!!!!!!! 请大侠们快帮帮忙呀 在线等!!!!


create table aa(id int,房间号 varchar(10),设备名称 varchar(10),设备功率 varchar(10),设备数量 varchar(10))
insert into aa values('1','1','A','100','1')
insert into aa values('2','1','B','30','20')
insert into aa values('3','1','C','100','1')
insert into aa values('4','2','A','100','1')
insert into aa values('5','2','B','100','20')
insert into aa values('6','2','C','100','1')
insert into aa values('7','2','D','100','1')
insert into aa values('8','2','E','100','1')

id 房间号 设备名称 设备功率 设备数量

1 1 A 100 1
2 1 B 30 20
3 1 C 100 1
4 2 A 30 20
5 2 B 100 1
6 2 C 30 20
7 2 D 100 1
8 2 E 30 20

现在想把他们变成

1(房间号) 100(A的功率) 20(设备B的数量) C(设备名)
2(房间号) 30(A的功率) 20(设备B的数量) C(设备名) D(设备名) E(设备名)

怎么变呀 在线等 急急!!!!
...全文
132 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
itymx 2008-06-28
  • 打赏
  • 举报
回复
drop table #aa
create table #aa (id int,房间号 varchar(10),设备名称 varchar(10),设备功率 varchar(10),设备数量 varchar(10))
insert into #aa values('1','1','A','100','1')
insert into #aa values('2','1','B','30','20')
insert into #aa values('3','1','C','100','1')
insert into #aa values('4','2','A','30','1')
insert into #aa values('5','2','B','100','20')
insert into #aa values('6','2','C','30','1')
insert into #aa values('7','2','D','100','1')
insert into #aa values('8','2','E','30','1')
insert into #aa values('9','3','A','100','1')
insert into #aa values('10','4','A','30','1')
insert into #aa values('11','4','B','100','1')
insert into #aa values('12','4','C','30','1')
insert into #aa values('13','4','D','100','1')
insert into #aa values('14','4','E','30','1')
insert into #aa values('15','4','F','100','1')
--select * from #aa

declare @sql nvarchar(max),@icnt int,@i int
select @sql ='',@i =1, @icnt = max(c) from (select count(1) as c from #aa group by [房间号]) a

set @sql = ' SELECT [房间号]+''(房间号)'' '
while @i <= @icnt
begin
if @i = 1 set @sql = @sql + ', col'+ltrim(@i)+'= max( CASE WHEN ASCII([设备名称]) = ' + ltrim(64+@i) +' THEN [设备功率]+ ''(A的功率)'' ELSE '''' END ) '
else if @i = 2 set @sql = @sql + ', col'+ltrim(@i)+'= max( CASE WHEN ASCII([设备名称]) = ' + ltrim(64+@i) +' THEN [设备数量]+ ''(设备B的数量)'' ELSE '''' END ) '
else set @sql = @sql + ', col'+ltrim(@i)+'= max( CASE WHEN ASCII([设备名称]) = ' + ltrim(64+@i) +' THEN [设备名称]+ ''(设备名)'' ELSE '''' END ) '
set @i = @i + 1
end

set @sql = @sql +' from #aa group by [房间号] '
--print @sql
exec (@sql)






服务器: 消息 170,级别 15,状态 1,行 20
第 20 行: 'max' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 21
必须声明变量 '@sql'。
服务器: 消息 170,级别 15,状态 1,行 21
第 21 行: 'a' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 24
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 24
必须声明变量 '@i'。
服务器: 消息 137,级别 15,状态 1,行 26
必须声明变量 '@i'。
服务器: 消息 137,级别 15,状态 1,行 26
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 27
必须声明变量 '@i'。
服务器: 消息 137,级别 15,状态 1,行 27
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 28
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 29
必须声明变量 '@i'。
服务器: 消息 137,级别 15,状态 1,行 32
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 34
必须声明变量 '@sql'。
itymx 2008-06-28
  • 打赏
  • 举报
回复
服务器: 消息 170,级别 15,状态 1,行 20
第 20 行: 'max' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 21
必须声明变量 '@sql'。
服务器: 消息 170,级别 15,状态 1,行 21
第 21 行: 'a' 附近有语法错误。
服务器: 消息 137,级别 15,状态 1,行 24
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 24
必须声明变量 '@i'。
服务器: 消息 137,级别 15,状态 1,行 26
必须声明变量 '@i'。
服务器: 消息 137,级别 15,状态 1,行 26
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 27
必须声明变量 '@i'。
服务器: 消息 137,级别 15,状态 1,行 27
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 28
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 29
必须声明变量 '@i'。
服务器: 消息 137,级别 15,状态 1,行 32
必须声明变量 '@sql'。
服务器: 消息 137,级别 15,状态 1,行 34
必须声明变量 '@sql'。
itymx 2008-06-28
  • 打赏
  • 举报
回复
把这一句加到那个地方 大哥

.....
CASE [设备名称] WHEN N'设备A' THEN [功率] WHEN N'设备B' THEN [数量] ELSE [设备名称] END AS [字段别名]
......

declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([设备名称])+'=max(case when [设备名称]='+quotename([设备名称],'''')+' then [设备数量] else 0 end)'
from aa group by[设备名称]
exec('select [房间号]'+@s+' from aa group by [房间号]')
hery2002 2008-06-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ranzj 的回复:]
大师在14楼给你搞完完整整了!
[/Quote]
天鹅兄,
不用称大师这么夸张吧,
学习......
hery2002 2008-06-28
  • 打赏
  • 举报
回复
--刚才的数据有点问题,修改了一下.
drop table #aa
create table #aa (id int,房间号 varchar(10),设备名称 varchar(10),设备功率 varchar(10),设备数量 varchar(10))
insert into #aa values('1','1','A','100','1')
insert into #aa values('2','1','B','30','20')
insert into #aa values('3','1','C','100','1')
insert into #aa values('4','2','A','30','1')
insert into #aa values('5','2','B','100','20')
insert into #aa values('6','2','C','30','1')
insert into #aa values('7','2','D','100','1')
insert into #aa values('8','2','E','30','1')
insert into #aa values('9','3','A','100','1')
insert into #aa values('10','4','A','30','1')
insert into #aa values('11','4','B','100','1')
insert into #aa values('12','4','C','30','1')
insert into #aa values('13','4','D','100','1')
insert into #aa values('14','4','E','30','1')
insert into #aa values('15','4','F','100','1')
--select * from #aa

declare @sql nvarchar(max),@icnt int,@i int
select @sql ='',@i =1, @icnt = max(c) from (select count(1) as c from #aa group by [房间号]) a

set @sql = ' SELECT [房间号]+''(房间号)'' '
while @i <= @icnt
begin
if @i = 1 set @sql = @sql + ', col'+ltrim(@i)+'= max( CASE WHEN ASCII([设备名称]) = ' + ltrim(64+@i) +' THEN [设备功率]+ ''(A的功率)'' ELSE '''' END ) '
else if @i = 2 set @sql = @sql + ', col'+ltrim(@i)+'= max( CASE WHEN ASCII([设备名称]) = ' + ltrim(64+@i) +' THEN [设备数量]+ ''(设备B的数量)'' ELSE '''' END ) '
else set @sql = @sql + ', col'+ltrim(@i)+'= max( CASE WHEN ASCII([设备名称]) = ' + ltrim(64+@i) +' THEN [设备名称]+ ''(设备名)'' ELSE '''' END ) '
set @i = @i + 1
end

set @sql = @sql +' from #aa group by [房间号] '
--print @sql
exec (@sql)
/*
col1 col2 col3 col4 col5 col6
------------------ ------------------- ----------------------- ------------------ ------------------ ------------------ ------------------
1(房间号) 100(A的功率) 20(设备B的数量) C(设备名)
2(房间号) 30(A的功率) 20(设备B的数量) C(设备名) D(设备名) E(设备名)
3(房间号) 100(A的功率)
4(房间号) 30(A的功率) 1(设备B的数量) C(设备名) D(设备名) E(设备名) F(设备名)
*/
正宗老冉 2008-06-28
  • 打赏
  • 举报
回复
大师在14楼给你搞完完整整了!
hery2002 2008-06-28
  • 打赏
  • 举报
回复
create table  #aa (id int,房间号 varchar(10),设备名称 varchar(10),设备功率 varchar(10),设备数量 varchar(10)) 
insert into #aa values('1','1','A','100','1')
insert into #aa values('2','1','B','30','20')
insert into #aa values('3','1','C','100','1')
insert into #aa values('4','2','A','100','1')
insert into #aa values('5','2','B','100','20')
insert into #aa values('6','2','C','100','1')
insert into #aa values('7','2','D','100','1')
insert into #aa values('8','2','E','100','1')
insert into #aa values('9','3','A','100','1')
insert into #aa values('10','4','A','100','1')
insert into #aa values('11','4','B','100','1')
insert into #aa values('12','4','C','100','1')
insert into #aa values('13','4','D','100','1')
insert into #aa values('14','4','E','100','1')
insert into #aa values('15','4','F','100','1')
--select * from #aa

declare @sql nvarchar(max),@icnt int,@i int
select @sql ='',@i =1, @icnt = max(c) from (select count(1) as c from #aa group by [房间号]) a

set @sql = ' SELECT [房间号]+''(房间号)'' '
while @i <= @icnt
begin
if @i = 1 set @sql = @sql + ', col'+ltrim(@i)+'= max( CASE WHEN ASCII([设备名称]) = ' + ltrim(64+@i) +' THEN [设备功率]+ ''(A的功率)'' ELSE '''' END ) '
else if @i = 2 set @sql = @sql + ', col'+ltrim(@i)+'= max( CASE WHEN ASCII([设备名称]) = ' + ltrim(64+@i) +' THEN [设备功率]+ ''(设备B的数量)'' ELSE '''' END ) '
else set @sql = @sql + ', col'+ltrim(@i)+'= max( CASE WHEN ASCII([设备名称]) = ' + ltrim(64+@i) +' THEN [设备名称]+ ''(设备名)'' ELSE '''' END ) '
set @i = @i + 1
end

set @sql = @sql +' from #aa group by [房间号] '
--print @sql
exec (@sql)
/*
col1 col2 col3 col4 col5 col6
------------------ ------------------- ----------------------- ------------------ ------------------ ------------------ ------------------
1(房间号) 100(A的功率) 30(设备B的数量) C(设备名)
2(房间号) 100(A的功率) 100(设备B的数量) C(设备名) D(设备名) E(设备名)
3(房间号) 100(A的功率)
4(房间号) 100(A的功率) 100(设备B的数量) C(设备名) D(设备名) E(设备名) F(设备名)

(4 row(s) affected)
*/
itymx 2008-06-28
  • 打赏
  • 举报
回复
大侠们 还都在不在了 急急急急!!!!!!!!!!
itymx 2008-06-28
  • 打赏
  • 举报
回复
只有 设备A和设备B比较特殊 再请 指教
itymx 2008-06-28
  • 打赏
  • 举报
回复
设备类型还不确定 还有可能有F ,G,H,I............. 但这些都是要他们的名称就行了
vest005 2008-06-28
  • 打赏
  • 举报
回复
再再再一次学习行转列。

今天周末,人少。


正宗老冉 2008-06-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 itymx 的回复:]
就是说 如果是设备A的话 就要 他的功率
如果是设备B的话 就要 他的数量
如果是设备C,D,E的话 就要 他的名称显出来
[/Quote]

这个好办,你用 CASE 处理.


......
CASE [设备名称] WHEN N'设备A' THEN [功率] WHEN N'设备B' THEN [数量] ELSE [设备名称] END AS [字段别名]
......
itymx 2008-06-28
  • 打赏
  • 举报
回复
请您再看看吧 帮帮小弟吧
itymx 2008-06-28
  • 打赏
  • 举报
回复
就是说 如果是设备A的话 就要 他的功率
如果是设备B的话 就要 他的数量
如果是设备C,D,E的话 就要 他的名称显出来
itymx 2008-06-28
  • 打赏
  • 举报
回复
我知道 我看了 大师 请您再仔细看看我所要的东西好吗 我用红字标的

1(房间号) 100(A的功率) 20(设备B的数量) C(设备名
2(房间号) 30(A的功率) 20(设备B的数量) C(设备名) D(设备名) E(设备名
正宗老冉 2008-06-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 itymx 的回复:]
怎么还没人啊!!!!
[/Quote]

晕,大师都把链接发给你了,你还想怎么样???????

呵呵.
itymx 2008-06-28
  • 打赏
  • 举报
回复
请你们在看看
行转列的问题???? !!!!!!!!!!!!! 请大侠们快帮帮忙呀 在线等!!!!


create table aa(id int,房间号 varchar(10),设备名称 varchar(10),设备功率 varchar(10),设备数量 varchar(10))
insert into aa values('1','1','A','100','1')
insert into aa values('2','1','B','30','20')
insert into aa values('3','1','C','100','1')
insert into aa values('4','2','A','100','1')
insert into aa values('5','2','B','100','20')
insert into aa values('6','2','C','100','1')
insert into aa values('7','2','D','100','1')
insert into aa values('8','2','E','100','1')

id 房间号 设备名称 设备功率 设备数量

1 1 A 100 1
2 1 B 30 20
3 1 C 100 1
4 2 A 30 20
5 2 B 100 1
6 2 C 30 20
7 2 D 100 1
8 2 E 30 20

现在想把他们变成

1(房间号) 100(A的功率) 20(设备B的数量) C(设备名)
2(房间号) 30(A的功率) 20(设备B的数量) C(设备名) D(设备名) E(设备名)


怎么变呀 在线等 急急!!!!
itymx 2008-06-28
  • 打赏
  • 举报
回复
怎么还没人啊!!!!
hery2002 2008-06-28
  • 打赏
  • 举报
回复
行列互转_整理贴3
http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html
正宗老冉 2008-06-28
  • 打赏
  • 举报
回复
(1)楼主可以从推荐/精华、已解决的帖子里搜一下,这个问题我见了不下 50 遍了,有很多比较完美的解决措施.

(2)等后面的Ctrl + V
加载更多回复(3)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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