SQL Server 2008 представил GROUPING SETS ()
, который, кажется, именно то, что вам нужно. Решение UNION, предложенное другими, теперь может быть легко заменено одним выбором с GROUPING SETS
.
По сути, вы используете это так:
SELECT A, B, C
FROM …
WHERE …
GROUP BY GROUPING SETS ( (A), (B), (C) )
, что эквивалентно
SELECT A, NULL, NULL, …
FROM …
WHERE …
GROUP BY A
UNION ALL
SELECT NULL, B, NULL, …
FROM …
WHERE …
GROUP BY B
UNION ALL
SELECT NULL, NULL, C, …
FROM …
WHERE …
GROUP BY C
Итак, ваш запрос может выглядеть так:
SELECT X, Y, COUNT(*)
FROM <i>your complex joins and filters</i>
GROUP BY GROUPING SETS ( (X), (Y) )
Или вот так:
SELECT
CASE WHEN X IS NULL THEN 'Y' ELSE 'X' END AS ObjType
CASE WHEN X IS NULL THEN Y ELSE X END AS Obj,
COUNT(*)
FROM <i>your complex joins and filters</i>
GROUP BY GROUPING SETS ( (X), (Y) )
Второй предполагает, что X
не может быть NULL.
Ссылки: