接上篇……
--二.行轉列結果加上其他列
--【1】行轉列結果+其他列
SELECT 年度,
SUM(CASE(月份) WHEN 1 THEN 數量 END) "1月份",
SUM(CASE(月份) WHEN 2 THEN 數量 END) "2月份",
SUM(CASE(月份) WHEN 3 THEN 數量 END) "3月份",
SUM(CASE(月份) WHEN 4 THEN 數量 END) "4月份",
SUM(CASE(月份) WHEN 5 THEN 數量 END) "5月份",
SUM(CASE(月份) WHEN 6 THEN 數量 END) "6月份",
SUM(CASE(月份) WHEN 7 THEN 數量 END) "7月份",
SUM(CASE(月份) WHEN 8 THEN 數量 END) "8月份",
SUM(CASE(月份) WHEN 9 THEN 數量 END) "9月份",
SUM(CASE(月份) WHEN 10 THEN 數量 END) "10月份",
SUM(CASE(月份) WHEN 11 THEN 數量 END) "11月份",
SUM(CASE(月份) WHEN 12 THEN 數量 END) "12月份",
SUM(數量)總數量,
CAST(avg(數量*1.0)as decimal(12,2)) 平均數量
FROM 訂單表
GROUP BY 年度
ORDER BY 年度
--【2】靜態SQL
select m.*,n.總數量,n.平均數量
from
(select * from 訂單表 pivot (SUM(數量) for 月份 in("1","2","3","4","5","6","7","8","9","10","11","12"))a)m,
(select 年度,SUM(數量)總數量,CAST(avg(數量)as decimal(12,2)) 平均數量 from 訂單表 group by 年度)n
where m.年度=n.年度
--【3】動態SQL
declare @sql varchar(8000)
set @sql='select 年度'
select @sql=@sql+',SUM(CASE CONVERT(VARCHAR(2),月份) WHEN '''+CONVERT(VARCHAR(2),月份)+''' THEN 數量 ELSE 0 END) ['+CONVERT(VARCHAR(2),月份)+']'
from(SELECT DISTINCT 月份 FROM 訂單表)a
set @sql=@sql+',SUM(數量)總數量,CAST(avg(數量)as decimal(12,2)) 平均數量 from 訂單表 group by 年度'
exec(@sql)
--【4】 動態SQL-使用stuff()
declare @sql varchar(8000)
set @sql='' --初始化變量@sql
select @sql=@sql+',"'+CAST(月份 AS VARCHAR(2))+'"' from 訂單表 group by 月份 --變量多值賦值
set @sql=stuff(@sql,1,1,'') --去掉首個','
set @sql='SELECT m.*,n.總數量,n.平均數量 FROM
(select * from 訂單表 pivot (SUM(數量) for 月份 in ('+@sql+')) a) m ,
(select 年度,SUM(數量) 總數量,CAST(avg(數量) as decimal(12,2)) 平均數量 from 訂單表 group by 年度) n
where m.年度=n.年度'
exec(@sql)
--或使用isnull()
declare @sql varchar(8000)
select @sql=isnull(@sql+',"','"')+CAST(月份 AS VARCHAR(2))+'"' from 訂單表 group by 月份
set @sql='SELECT m.*,n.總數量,n.平均數量 FROM
(select * from 訂單表 pivot (SUM(數量) for 月份 in ('+@sql+'))a) m ,
(select 年度,SUM(數量) 總數量,CAST(avg(數量) as decimal(12,2)) 平均數量 from 訂單表 group by 年度) n
where m.年度=n.年度'
exec(@sql)