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