我有以下疑问:
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\u id shipcountry shipcregion 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\u id列背后的逻辑以及0、1、3、7是如何生成的?
2条答案
按热度按时间ipakzgxi1#
GROUPING_ID
返回一个int,其中位设置指定是否聚合对应列(1表示聚合)。所以:等等。此函数和
GROUPING()
当键值可以NULL
价值观。经常,NULL
用于确定要上卷哪些列。但是,如果钥匙本身可以打开,那就不安全了NULL
.uidvcgyl2#
grouping_id()接受一些分组列的列表作为inout,并返回一个表示位图的整数。最右边的位表示最右边的输入。当相应的元素是分组集的一部分时,位为0,当它不是分组集的一部分时,位为1。每一位代表2,提升到位位置减1的幂次方;所以,最右边的一位代表1,左边的一位代表2,然后是4,然后是8,依此类推。结果整数是表示由于位已打开而不属于分组集的元素的值的总和。
尝试按以下方式修改查询,以了解位的逻辑: