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
    评论
HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 联合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值