Truy vấn sau sẽ cung cấp cho bạn những gì bạn muốn:
SELECT Store,
TotalSold,
[John] AS WastedByJohn,
[Jim] AS WastedByJim,
[Alex] AS WastedByAlex
FROM (SELECT Store, Employee, Waste,
SUM(Sold) OVER (PARTITION BY Store) AS TotalSold
FROM #Foo) src
PIVOT
(SUM(Waste)
FOR Employee IN ([John], [Jim], [Alex])
) PVT
Để hiểu tại sao bạn nhận được kết quả không mong muốn, hãy thử truy vấn của bạn mà không có GROUP BY
mệnh đề:
SELECT Store, Sold, [John], [Jim], [Alex]
FROM
#Foo
PIVOT
(SUM(Waste)
FOR Employee IN ([John], [Jim], [Alex])
) PVT
Đầu ra:
Store Sold John Jim Alex
Harrisburg 20,00 20,00 10,00 NULL
Seattle 20,00 NULL 10,00 10,00
Bây giờ, hãy thử lại tương tự với phiên bản thứ hai của dữ liệu mẫu:
Đầu ra:
Store Sold John Jim Alex
Harrisburg 25,00 10,00 NULL NULL
Harrisburg 30,00 10,00 NULL NULL
Harrisburg 40,00 NULL 10,00 NULL
Seattle 50,00 NULL 10,00 NULL
Seattle 60,00 NULL NULL 10,00
Bằng cách so sánh 2 bộ kết quả khác nhau, bạn có thể thấy rõ rằng PIVOT
diễn ra cho mọi kết hợp cột không tham gia vào nó, tức là cho mọi kết hợp Store
, Sold
.
Trong trường hợp đầu tiên, chỉ có Harrisburg,20,00
và Seattle,20,00
. Đó là lý do tại sao bạn chỉ nhận được hai hàng trong trường hợp này. Trong trường hợp thứ hai, bạn có tổng số 3 + 2 =5 kết hợp.
Bây giờ bạn có thể thấy lý do tại sao GROUP BY
chỉ hoạt động trong trường hợp thứ hai.