SQL:分组集和数据透视的替代和替换
我有这样的代码:SQL:分组集和数据透视的替代和替换,sql,sql-server,tsql,subquery,olap,Sql,Sql Server,Tsql,Subquery,Olap,我有这样的代码: SELECT id, YEAR(datek) AS YEAR, COUNT(*) AS NUM FROM Orders GROUP BY GROUPING SETS ( (id, YEAR(datek)), id, YEAR(datek), () ); 它给了我这个输出: 1 NULL 4 2 NULL 11 3 NULL 6 NULL NULL 21 1 2006 36 2 2006
SELECT id, YEAR(datek) AS YEAR, COUNT(*) AS NUM
FROM Orders
GROUP BY GROUPING SETS
(
(id, YEAR(datek)),
id,
YEAR(datek),
()
);
它给了我这个输出:
1 NULL 4
2 NULL 11
3 NULL 6
NULL NULL 21
1 2006 36
2 2006 56
3 2006 51
NULL 2006 143
1 2007 130
2 2007 143
3 2007 125
NULL 2007 398
1 2008 79
2 2008 116
3 2008 73
NULL 2008 268
NULL NULL 830
1 NULL 249
2 NULL 326
3 NULL 255
我需要做的是不使用“分组集”(也不使用多维数据集或汇总),而是使用相同的结果来编写它。我想写三个不同的查询,并用“union”连接它们。我在GroupBy设置中尝试了类似“null”的东西,但它不起作用
SELECT id, YEAR(datek) AS rok, COUNT(*) AS NUM
FROM Orders
GROUP BY id, YEAR(datek)
UNION
SELECT id, YEAR(datek) AS rok, COUNT(*) AS NUM
FROM Orders
GROUP BY id, null
order by id, YEAR(datek)
我还有一个关于“支点”的问题。什么样的语法可以用“PIVOT”替换查询
谢谢你的时间和所有的答案 您是对的,您需要单独的查询,尽管您实际上需要4个,而不是
按NULL分组
,只需按相应分组集中的列分组,并将选择
中的列替换为NULL
:
SELECT id, YEAR(datek) AS rok, COUNT(*) AS NUM
FROM Orders
GROUP BY id, YEAR(datek)
UNION ALL
SELECT id, NULL, COUNT(*) AS NUM
FROM Orders
GROUP BY id
UNION ALL
SELECT NULL, YEAR(datek), COUNT(*) AS NUM
FROM Orders
GROUP BY YEAR(datek)
UNION ALL
SELECT NULL, NULL, COUNT(*) AS NUM
FROM Orders
ORDER BY ID, Rok
关于替换PIVOT
的问题,我认为最好的选择是使用条件聚合,例如,代替:
SELECT pvt.SomeGroup,
pvt.[A],
pvt.[B],
pvt.[C]
FROM T
PIVOT (SUM(Val) FOR Col IN ([A], [B], [C])) AS pvt;
您可以使用:
SELECT T.SomeGroup,
[A] = SUM(CASE WHEN T.Col = 'A' THEN T.Val ELSE 0 END),
[B] = SUM(CASE WHEN T.Col = 'B' THEN T.Val ELSE 0 END),
[C] = SUM(CASE WHEN T.Col = 'C' THEN T.Val ELSE 0 END)
FROM T
GROUP BY T.SomeGroup;
@GarethD很迂腐,实际上,对于pivot,
ELSE NULL
将是等效的,而不是ELSE 0
。