导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

这段sql是什么意思?

sha256cn hejin 技术总监/研发总监  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是什么意思啊,谁能详细解释一下,谢谢
...全文
7 点赞 收藏 3
写回复
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 看一下,你就会比较清楚了


回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告