首页 > 解决方案 > 无法理解 GROUPING_ID() 函数在我的情况下是如何工作的

问题描述

我有以下查询:

SELECT GROUPING_ID( shipcountry, shipregion, shipcity ) AS grp_id,
shipcountry, shipregion, shipcity,
COUNT(*) AS numorders
FROM Sales.Orders
GROUP BY ROLLUP( shipcountry, shipregion, shipcity );

此查询生成以下输出(此处以缩写形式显示): grp_id shipcountry shipregion shipcity numorders

0     Argentina   NULL       Buenos Aires 16
1     Argentina   NULL       NULL         16
3     Argentina   NULL       NULL         16
...
0     USA         AK         Anchorage    10
1     USA         AK         NULL         10
0     USA         CA         San Francisco 4
1     USA         CA         NULL          4
0     USA         ID         Boise        31
1     USA         ID         NULL         31
...
3     USA         NULL       NULL        122
...
7     NULL        NULL       NULL        830

我想了解 grp_id 列背后的逻辑以及 0,1,3,7 是如何生成的?

标签: sqlsql-servertsql

解决方案


GROUPING_ID返回一个设置了位的 int,指定相应的列是否被聚合(“1”表示聚合)。所以:

0   --> 000 --> no rollup
1   --> 001 --> rollup on shipcountry
7   --> 111 --> rollup on all three columns

等等。GROUPING()当键值可以取值时,此功能特别有用NULL。通常,NULL用于确定正在汇总哪些列。但是,如果密钥本身可以,那是不安全的NULL


推荐阅读