日期:2014-05-18  浏览次数:20565 次

帮忙解释一条sql语句
--創建測試環境
Create   Table   表
(部门编号   Int,
  费用类型   Nvarchar(20),
  费用金额   Int)
Insert   表   Select             2,               N '差旅费 ',           11
Union   All   Select             2,               N '邮电费 ',           22
Union   All   Select             2,               N '业务费 ',           33  
GO
--測試
Declare   @S   Nvarchar(4000)
Select   @S   =   N 'Select   部门编号 '
Select   @S   =   @S   +   N ',   SUM(Case   费用类型   When   N ' ' '   +   费用类型   +   N ' ' '   Then   费用金额   Else   0   End)   As   [ '   +   费用类型   +   '] '
From   表   Group   By   费用类型
Select   @S   =   @S   +   N '   From   表   Group   By   部门编号 '
EXEC(@S)
GO
--刪除測試環境
Drop   Table   表
--結果
/*
部门编号差旅费业务费邮电费
2113322
*/

请高手解释以下@s这个变量的值,特别是Select   @S   =   @S   +   N ',   SUM(Case   费用类型   When   N ' ' '   +   费用类型   +   N ' ' '   Then   费用金额   Else   0   End)   As   [ '   +   费用类型   +   '] '
From   表   Group   By   费用类型
这句

------解决方案--------------------
最終@S中執行的語句為

Select
部门编号,
SUM(Case 费用类型 When N '差旅费 ' Then 费用金额 Else 0 End) As [差旅费],
SUM(Case 费用类型 When N '邮电费 ' Then 费用金额 Else 0 End) As [邮电费],
SUM(Case 费用类型 When N '业务费 ' Then 费用金额 Else 0 End) As [业务费]
From

Group By
部门编号

對比這兩段代碼,可以容易理解點。
------解决方案--------------------
Select @S = @S + N ', SUM(Case 费用类型 When N ' ' ' + 费用类型 + N ' ' ' Then 费用金额 Else 0 End) As [ ' + 费用类型 + '] '
From 表 Group By 费用类型


這段代碼就是為了循環拼結出這段代碼

,SUM(Case 费用类型 When N '差旅费 ' Then 费用金额 Else 0 End) As [差旅费]
,SUM(Case 费用类型 When N '邮电费 ' Then 费用金额 Else 0 End) As [邮电费]
SUM(Case 费用类型 When N '业务费 ' Then 费用金额 Else 0 End) As [业务费]
------解决方案--------------------
Select @S = @S + 费用类型+ ',这里是字符串!!, ' From 表 Group By 费用类型

再print @S 看看,你就会明白的了
------解决方案--------------------
print(@S)
EXEC(@S)

相当于把多行的数据,连接成横向的串了。
------解决方案--------------------
横列转换,print @s 后,你就看的很清楚啦!