Wenn es nicht massiv ist, können Sie CTE gekettet verwenden:
DECLARE @activity AS TABLE
(
[uid] INT
, [approved] NVARCHAR(25)
, [denied] NVARCHAR(25)
, [moved] NVARCHAR(25)
, [pending] NVARCHAR(25)
);
INSERT INTO @activity
([uid]
, [approved]
, [denied]
, [moved]
, [pending])
VALUES (1,N'Curly',NULL,NULL,NULL),
(2,NULL,NULL,N'Curly',NULL),
(3,N'Curly',NULL,NULL,N'Mo'),
(4,NULL,NULL,N'Joe',NULL),
(5,N'Joe',NULL,N'Joe',NULL),
(6,N'Joe',N'Shemp',N'Joe',NULL);
WITH [approved_builder]
AS (SELECT [approved] AS [name]
, count(*) AS [approved]
FROM @activity
WHERE [approved] IS NOT NULL
GROUP BY [approved])
, [moved_builder]
AS (SELECT [moved] AS [name]
, count(*) AS [moved]
FROM @activity
WHERE [moved] IS NOT NULL
GROUP BY [moved])
, [denied_builder]
AS (SELECT [denied] AS [name]
, count(*) AS [denied]
FROM @activity
WHERE [denied] IS NOT NULL
GROUP BY [denied])
, [pending_builder]
AS (SELECT [pending] AS [name]
, count(*) AS [pending]
FROM @activity
WHERE [pending] IS NOT NULL
GROUP BY [pending])
, [aggregator]
AS (SELECT [name]
, [approved] AS [approved]
, 0 AS [denied]
, 0 AS [moved]
, 0 AS [pending]
FROM [approved_builder]
UNION ALL
SELECT [name]
, 0 AS [approved]
, 0 AS [denied]
, [moved] AS [moved]
, 0 AS [pending]
FROM [moved_builder]
UNION ALL
SELECT [name]
, 0 AS [approved]
, [denied] AS [denied]
, 0 AS [moved]
, 0 AS [pending]
FROM [denied_builder]
UNION ALL
SELECT [name]
, 0 AS [approved]
, 0 AS [denied]
, 0 AS [moved]
, [pending] AS [pending]
FROM [pending_builder])
SELECT [name] AS [name]
, sum([approved]) AS [approved]
, sum([denied]) AS [denied]
, sum([moved]) AS [moved]
, sum([pending]) AS [pending]
FROM [aggregator]
GROUP BY [name];
Wenn ein Name in genehmigt nicht gefunden wird, wird es nicht funktionieren, auch gibt es Null als Benutzername zurück – Hadi