[T-SQL] 使用 Pivot 語法彙總卻不彙總

在 SQL Server 中撰寫 T-SQL 應用 Pivot 語法,原本預期從左側的原始資料透過 Pivot 得到 (1) 的結果,
但偶而會遇到數值沒有合計,資料呈現為兩筆的狀況,如下圖 (2) 的狀況。

image


進一步了解,Pivot 語法中對於原始資料有三種概念

1.  column being aggregated 要彙總的資料行,此案例為 Amount

2.  column that contains the values that will become column headers 包含將變成資料行標頭之值的資料行,此案例為 Customer

3. first pivoted column, second pivoted column… ,此案例為 A001, A002

Pivot 計算過程會將上述之外的資料欄位進行群組,若有其他欄位值不相同者時則發生呈現多筆的狀況。
當發生類似的狀況可以檢查有否查詢多餘的欄位,從來源中移除欄位即可解決。

範例

/*原始資料*/
DECLARE @OrderTable as Table(ID int, Customer varchar(8), OrderDate date, Amount int)

insert @OrderTable(ID, Customer, OrderDate, Amount)
select 1, 'A001', convert(date, '2018-10-01'), 100
union all
select 1, 'A001', convert(date, '2018-10-01'), 110
union all
select 2, 'A001', convert(date, '2018-10-01'), 120
union all
select 2, 'A001', convert(date, '2018-10-01'), 130
union all
select 3, 'A002', convert(date, '2018-10-01'), 200;

select * from @OrderTable;

/*發生錯誤的 Pivot 結果*/
select OrderDate, A001, A002
from 
(
	select ID, Customer, OrderDate, Amount /*多 ID 造成錯誤*/
	from @OrderTable A
)Src
Pivot(
	sum(Amount) 
	for Customer in ( [A001], [A002])
) PT;

/*正確的 Pivot 結果*/
select OrderDate, A001, A002
from(
	select OrderDate, Customer, Amount
	from @OrderTable A
)Src
Pivot(
	sum(Amount) 
	for Customer in ( [A001], [A002])
) PT;