一个行转列的语句

newchenj 2011-02-28 02:02:58
新人请求指点,
declare @sql varchar(8000)
set @sql = 'select Products'
select @sql=@sql+',max(case material when '''+material +''' then quantity else 0 end) ['+material +']'
from (select distinct material from scll) as a
set @sql = @sql + ' from scll group by Products'
exec(@sql)
这是列转行的一段语句,其中的max(case material when '''+material +''' then quantity else 0 end) ['+material +']'
,不知是什么意思?请高手解释一下.谢谢.
...全文
124 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn 2011-02-28
  • 打赏
  • 举报
回复
--举个例子就明白了
create table #
(
[name] varchar(100)
)
insert #
select 'a' union all
select 'b' union all
select 'c'

declare @str varchar(max)
set @str = ''

select @str = @str + [name] + ',' from # --从#表中取出的多行记录,都会累加到变量@str上
select @str
/*
(无列名)
a,b,c,
*/
AcHerat 2011-02-28
  • 打赏
  • 举报
回复
select @sql=@sql+',max(case material when '''+material +''' then quantity else 0 end) ['+material +']'
from (select distinct material from scll) as a

下边的from后的子查询是找出了所有material可能存在的值,例如material有 'a'、'b'、'c'三个值,上边的case material when ''' + material + '''相当于case material when 'a' case material when 'b' case material when 'c' 找出对应的quantity的值! 再不懂你就直接写出case when语句运行的结果看看,然后对比下两种方法,可定能弄懂这个动态的。
newchenj 2011-02-28
  • 打赏
  • 举报
回复
是的,material是转换后的列名,生成动态的sql,'''+material +'''这个为什么要这样写啊?不太明白.
linjunf 2011-02-28
  • 打赏
  • 举报
回复
每天发帖就有10分..
楼上说的对那是用一表的字段做列头 拼装动态sql 你把每句@SQL print 出来 看看就明白了
AcHerat 2011-02-28
  • 打赏
  • 举报
回复
material 是你根据什么来行转列的!
例如

id-----name----num
1 a 2
1 b 1
2 a 4
2 b 9

行转列

id-----a-----b
1 2 1
2 4 9

那么这时的 material 就是上面的name了。

22,210

社区成员

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

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