0%

【SQL】PIVOT 讓搜尋結果橫式表現

有時候SQL搜尋出來的資料是直式的,但偏偏PM們常常想看的卻是橫式報表,狀況模擬如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE @Report TABLE (
CompanyName varchar(8),
[Year] int,
[Month] int,
Revenue int)

insert @Report values('A公司',2016,1,100)
insert @Report values('A公司',2016,2,100)
insert @Report values('A公司',2016,3,100)

insert @Report values('B公司',2016,1,200)
insert @Report values('B公司',2016,2,200)
insert @Report values('B公司',2016,3,200)

insert @Report values('總公司',2016,1,300)
insert @Report values('總公司',2016,2,300)
insert @Report values('總公司',2016,3,300)

select * from @Report

[![](https://3.bp.blogspot.com/-qirx6weBsrU/Vt4qvqqJUMI/AAAAAAAAHus/HnoX8Epl2xY/s320/1.png)](https://3.bp.blogspot.com/-qirx6weBsrU/Vt4qvqqJUMI/AAAAAAAAHus/HnoX8Epl2xY/s1600/1.png)
這是資料在資料庫裡面的記錄方式
[![](https://4.bp.blogspot.com/-u18YG_Pkcro/Vt4rc9-XmnI/AAAAAAAAHuw/R12QCiukmio/s1600/1.png)](https://4.bp.blogspot.com/-u18YG_Pkcro/Vt4rc9-XmnI/AAAAAAAAHuw/R12QCiukmio/s1600/1.png)
PM想看到的

還好MS SQL 2005之後提供PIVOT來解決這種問題,實際SQL如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
select 
[date] as '年/月份',
[A公司] as 'A公司' ,[B公司] as 'B公司' ,([A公司] + [B公司] + [總公司]) as '總公司'
from(
select
CompanyName,
cast([Year] as char(4)) + '/' + cast([Month] as char(2)) as [date],
Revenue
from @Report
group by CompanyName,[Year],[Month],Revenue
) as TempReportTable
PIVOT
(
sum(Revenue)
for CompanyName in ([A公司] ,[B公司] ,[總公司])
)as PivotTable

[![](https://3.bp.blogspot.com/-iPNlxbN3F60/Vt4vAwWbJbI/AAAAAAAAHu8/UEDA-UufY6M/s320/1.png)](https://3.bp.blogspot.com/-iPNlxbN3F60/Vt4vAwWbJbI/AAAAAAAAHu8/UEDA-UufY6M/s1600/1.png)
算出結果