GROUPING SETS特殊用法之grouping__id

GROUPING SETS用法之grouping__id

场景描述

根据月份,多级商品类目(包括id 和 对应的名称) 汇总商品数

当前场景使用不了 rollup 以及 cube ,原因是这里有同级商品类别的id和name,需要保持同步,如果使用cube或者rollup,''
则会出现id,'全部' 或者 '全部',id 的情况出现,但是用grouping__id可以避免这种情况的发生

具体sql代码 及 代码解析


具体的sql:
SELECT 
     IF(GROUPING__ID & 4 = 4, 'ALL' ,lv3_goods_id)           AS  lv3_goods_id  
    ,IF(GROUPING__ID & 4 = 4, '全部',MAX(lv3_goods_name))    AS  lv3_goods_name
    ,IF(GROUPING__ID & 2 = 2, 'ALL' ,lv2_goods_id)           AS  lv2_goods_id  
    ,IF(GROUPING__ID & 2 = 2, '全部',MAX(lv2_goods_name))    AS  lv2_goods_name
    ,IF(GROUPING__ID & 1 = 1, 'ALL' ,lv1_goods_id)           AS  lv1_goods_id  
    ,IF(GROUPING__ID & 1 = 1, '全部',MAX(lv1_goods_name))    AS  lv1_goods_name
    ,count(distinct lv4_goods_id) as lv4_goods_num 
FROM 
    (
    SELECT
         lv1_goods_id
        ,lv1_goods_name
        ,lv2_goods_id
        ,lv2_goods_name
        ,lv3_goods_id
        ,lv3_goods_name
        ,lv4_goods_id
    FROM database.goods_info
    ) t1
GROUP BY 
 lv3_goods_id
,lv2_goods_id
,lv1_goods_id
     GROUPING SETS
     (
         (lv1_goods_id)   
        ,(lv1_goods_id,lv2_goods_id)
        ,(lv1_goods_id,lv2_goods_id,lv3_goods_id)
		,()
     ) 

-------------------------------------- 代码解析 --------------------------------------
4的二进制
0000 0100


-- 跟下面的group by 的字段位置有关
 GROUP BY   
     lv3_goods_id   
    ,lv2_goods_id
    ,lv1_goods_id
      GROUPING SETS
      (
         (lv1_goods_id)   
        ,(lv1_goods_id,lv2_goods_id)
        ,(lv1_goods_id,lv2_goods_id,lv3_goods_id)
	,()
      ) 
		 
		 
四种分组对应的二进制  按位取反  取反后的二进制  我认为取反之后 为1的这个位置是汇总列,所以只有这一列为1,那么就是对应的全部,所以采用按位与的方式
001                   ==>                        110
011                   ==>                        100
111                   ==>                        000
000	              ==>                        111


-- 对于下面的判断
 ,IF(GROUPING__ID & 4 = 4, 'ALL' ,lv3_goods_id)           AS  lv3_goods_id  
 ,IF(GROUPING__ID & 4 = 4, '全部',MAX(lv3_goods_name))    AS  lv3_goods_name
 ,IF(GROUPING__ID & 2 = 2, 'ALL' ,lv2_goods_id)           AS  lv2_goods_id  
 ,IF(GROUPING__ID & 2 = 2, '全部',MAX(lv2_goods_name))    AS  lv2_goods_name
 ,IF(GROUPING__ID & 1 = 1, 'ALL' ,lv1_goods_id)           AS  lv1_goods_id  
 ,IF(GROUPING__ID & 1 = 1, '全部',MAX(lv1_goods_name))    AS  lv1_goods_name
		
		
-- 举例说明 GROUPING__ID & 4 = 4 
4的二进制是 0000 0100 

GROUPING__ID & 4 = 4 

下面四种 按位与 4 后 等于 0000 0100 的组合是    (lv1_goods_id),(lv1_goods_id,lv2_goods_id),()         
0110
0100
0111

即对一级,一级+二级,全部汇总 三种角度去汇总数据时,三级类目使用 "全部" 表示
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值