相对于 JonWay 之前给出的解决方案,为了添加一个包含 A_name 和 B_name 总量的“结果”列,我们可以创建一个总计视图并将其添加到主查询中
CREATE TABLE A (A_ID INT, A_Name Varchar(100))
INSERT INTO A VALUES (1,'X'),(2,'Y'),(3,'Z');
CREATE TABLE B (B_ID INT,A_ID INT, B_Name Varchar(100))
INSERT INTO B VALUES (10,1,'P'),(11,2,'Q'),(12,1,'R');
CREATE TABLE C (B_ID INT,C_DATE DATE, C_QTY INT)
INSERT INTO C VALUES (10,'2017-01-01',100),(10,'2017-01-02',200),
(11,'2017-01-03',250),(11,'2017-01-03',50),(12,'2017-01-07',300);
-- Create the view separately after having created the tables
CREATE VIEW R_sum
AS
SELECT A.A_id, B.B_id, SUM(C.C_qty) AS Sum_qty
FROM A INNER JOIN
B ON A.A_id = B.A_id INNER JOIN
C ON B.B_id = C.B_id
GROUP BY A.A_id, B.B_id
------------- PIVOT AS FOLLOWS
DECLARE @Cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SET @Cols = STUFF((SELECT distinct ',' + QUOTENAME(C_DATE) FROM C
FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
SET @query = 'SELECT * FROM(
SELECT
A.A_Name,
B.B_Name,
C.C_DATE,
C.C_QTY,
R.Sum_qty as Result
FROM A A
INNER JOIN B ON A.A_ID=B.A_ID
RIGHT JOIN C ON B.B_ID=C.B_ID
RIGHT JOIN R_Sum R ON B.A_ID=R.A_ID AND B.B_ID=R.B_ID
) ABC
PIVOT
(
SUM(C_QTY) FOR [C_DATE] IN (' + @Cols + ')
) AS PV1';
EXEC sp_executesql @query