无法理解grouping\u id()函数在我的示例中是如何工作的

xytpbqjk  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(284)

我有以下疑问:

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是如何生成的?

ipakzgxi

ipakzgxi1#

GROUPING_ID 返回一个int,其中位设置指定是否聚合对应列(1表示聚合)。所以:

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

等等。此函数和 GROUPING() 当键值可以 NULL 价值观。经常, NULL 用于确定要上卷哪些列。但是,如果钥匙本身可以打开,那就不安全了 NULL .

uidvcgyl

uidvcgyl2#

grouping_id()接受一些分组列的列表作为inout,并返回一个表示位图的整数。最右边的位表示最右边的输入。当相应的元素是分组集的一部分时,位为0,当它不是分组集的一部分时,位为1。每一位代表2,提升到位位置减1的幂次方;所以,最右边的一位代表1,左边的一位代表2,然后是4,然后是8,依此类推。结果整数是表示由于位已打开而不属于分组集的元素的值的总和。
尝试按以下方式修改查询,以了解位的逻辑:

SELECT CAST(GROUPING(shipcountry) AS VARCHAR(1)) +
CAST(GROUPING(shipregion) AS VARCHAR(1)) + CAST(GROUPING(shipcity ) AS VARCHAR(1)) AS grp_id,
shipcountry, shipregion, shipcity,
COUNT(*) AS numorders
FROM Sales.Orders
GROUP BY ROLLUP( shipcountry, shipregion, shipcity );

相关问题