Вы не опубликовали схему таблицы, поэтому я попытался определить ее.Я начал с ввода, который вы дали (см. Комментарий в самом внутреннем SELECT
), поэтому вы должны иметь возможность адаптировать его к вашей фактической схеме.Я добавил дополнительного автора без каких-либо документов, потому что я решил, что вы захотите увидеть их в итоговом отчете.Тривиально исключить этих авторов.
DECLARE @Status table
(
Id int NOT NULL,
Status nvarchar(50) NOT NULL
)
DECLARE @Authors table
(
Id int NOT NULL,
Name nvarchar(50) NOT NULL
)
DECLARE @Documents table
(
Id int NOT NULL,
AuthorId int NOT NULL,
StatusId int NOT NULL
)
INSERT INTO @Status VALUES (1, 'Duplicate')
INSERT INTO @Status VALUES (2, 'Failure')
INSERT INTO @Status VALUES (3, 'Rejected')
INSERT INTO @Status VALUES (4, 'Success')
INSERT INTO @Authors VALUES (1, 'Alan')
INSERT INTO @Authors VALUES (2, 'Bob')
INSERT INTO @Authors VALUES (3, 'Charles')
INSERT INTO @Authors VALUES (4, 'Dave')
INSERT INTO @Authors VALUES (5, 'Tom') -- Test for authors without documents
INSERT INTO @Documents VALUES (1, 1, 4)
INSERT INTO @Documents VALUES (2, 2, 2)
INSERT INTO @Documents VALUES (3, 2, 4)
INSERT INTO @Documents VALUES (4, 3, 4)
INSERT INTO @Documents VALUES (5, 4, 2)
INSERT INTO @Documents VALUES (6, 4, 1)
SELECT
(CASE WHEN GROUPING(Name) = 1 THEN 'Total' ELSE Name END) AS Author,
SUM(Duplicate) AS Duplicate,
SUM(Failure) AS Failure,
SUM(Rejected) AS Rejected,
SUM(Success) AS Success,
SUM(Duplicate + Failure + Rejected + Success) AS Total
FROM
(
SELECT
Name,
(CASE WHEN Status = 'Duplicate' THEN 1 ELSE 0 END) AS Duplicate,
(CASE WHEN Status = 'Failure' THEN 1 ELSE 0 END) AS Failure,
(CASE WHEN Status = 'Rejected' THEN 1 ELSE 0 END) AS Rejected,
(CASE WHEN Status = 'Success' THEN 1 ELSE 0 END) AS Success
FROM
(
-- Original input
SELECT
a.Name,
s.Status
FROM @Authors a
LEFT OUTER JOIN @Documents d ON d.AuthorId = a.Id
LEFT OUTER JOIN @Status s ON d.StatusId = s.Id
) i
) j
GROUP BY Name WITH ROLLUP
Вывод:
Author Duplicate Failure Rejected Success Total
Alan 0 0 0 1 1
Bob 0 1 0 1 2
Charles 0 0 0 1 1
Dave 1 1 0 0 2
Tom 0 0 0 0 0
Total 1 2 0 3 6