这段sql是什么意思?

sha256cn 2003-12-18 11:04:26
看到一个列转行的例子,但是不明白其中的SQL语法,望那位大侠不吝赐教
1: 列转为行:
eg1:
Create table test (name char(10),km char(10),cj int)
go
insert test values('张三','语文',80)
insert test values('张三','数学',86)
insert test values('张三','英语',75)
insert test values('李四','语文',78)
insert test values('李四','数学',85)
insert test values('李四','英语',78)

想变成

姓名 语文 数学 英语
张三 80 86 75
李四 78 85 78


declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
exec(@sql)

从declare @sql varchar(8000)开始起的SQL是什么意思啊,谁能详细解释一下,谢谢
...全文
96 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
binshan 2003-12-18
  • 打赏
  • 举报
回复
打印出来是这样的:

select name,sum(case km when '数学 ' then cj end) [数学 ],sum(case km when '英语 ' then cj end) [英语 ],sum(case km when '语文 ' then cj end) [语文 ] from test group by name

所以应该这样理解:

declare @sql varchar(8000)
set @sql = 'select name'

select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
from (select distinct km from test) as a

这个语句如果去掉那些字符串(如',sum(case km when ''',''' then cj end) ['),就好理解一些了!
select km from (select distinct km from test) as a

结果如下:
km
----------
数学
英语
语文

(3 row(s) affected)

那句话的能句生成一个动态的SQL语句!

sum(case km when '数学 ' then cj end) [数学 ],sum(case km when '英语 ' then cj end) [英语 ],sum(case km when '语文 ' then cj end) [语文 ]

最后就能够得到想要的SQL语句,最后查询出想要的结果,这方法是好,但效率不高,请教那位能有更好的方法。多谢!


gmlxf 2003-12-18
  • 打赏
  • 举报
回复
多多看,练习动态sql语句,就会明白了。
是啊,你可以将@sql打印出来,然后拷贝执行看看,这样会更清楚。
如:
print @sql
erigido 2003-12-18
  • 打赏
  • 举报
回复
使用动态 sql语句,将所有不同姓名的数据进行统计
最主要是这一段 select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'建议在最后用 select @sql 看一下,你就会比较清楚了


34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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