zoukankan      html  css  js  c++  java
  • 8第八章CTE递归及分组汇总高级部分(多维数据集)(转载)

    8第八章CTE递归及分组汇总高级部分(多维数据集)
    这里贴图太麻烦。。。算了

    UNION 等集合操作符:
    UNION 等以第一个 SELECT  的 列明 作为 整个结果集的列明,整个结果集 唯一认可的 唯一逻辑处理阶段 是 ORDER BY 
    这个意思是说 只有 ORDER BY 是对整个结果集作用的,其它都操作都作用在 UINON 两侧的 子集合中。
    EXCEPT 操作符也是 提出了重复值的
    此外,它认为两个 null 值是相等的,
    而 NOT EXISTS 认为两个 null 值不相等,
    集合操作符的 优先级是 INTERSECT 最大,其它都一样


    CTE 递归 是个 重点, 分为 单个 定位点成员,单个递归成员,多个定位点,多个递归成员
    1. 单个 定位点成员,单个递归成员

    //todo
    2. 多个定位点,多个递归成员

    // todo


    特别注意 只有一个维度去观看的时候,WITH CUBE 或者 WITH ROLLUP 的结果是一样的。
    而下面 例子中的 WITH CUBE 或者 WITH ROLLUP 语句都会被 GROUP BY 后面的 CUBE(col1,col2) 或者 ROLLUP(col1,col2) 所替代,因为这种更加符合 ISO 标准些

    IF object_id('dbo.Inventory','U') IS NOT NULL 
    DROP TABLE dbo.Inventory 
    GO

    CREATE TABLE Inventory(
        Item varchar(5),
        Color char(4),
        Qty int
    )
    INSERT INTO dbo.Inventory 
    VALUES('桌子','蓝色',2),
            ('桌子','红色',1),
            ('桌子','蓝色',3),
            ('椅子','蓝色',4),
            ('椅子','红色',6),
            ('椅子','红色',5)

    select Item,Color,SUM(Qty) AS Sum_Qty from dbo.Inventory GROUP BY Item,Color WITH CUBE  --  Group by Item,Color WITH CUBE 也可以替换为 Group by CUBE(Item,Color) 以下同理

    select Item,Color,SUM(Qty) AS Sum_Qty from dbo.Inventory GROUP BY Item,Color with rollup


    重点:
    区分 空值与汇总值
    使用 Grouping(Item) 或者 Grouping(Color) 函数 去区分
    当 Grouping 函数返回 1 时候证明是汇总的,否则 就是真正的 null 值

    1. Cube ------======---

    select 
    CASE WHEN Grouping(Item) = 1 
    Then '汇总' ELSE ISNULL(Item,'未知') 
    End as Item,
    CASE WHEN Grouping(Color) = 1 Then '汇总' ELSE ISNULL(Color,'未知') End as Item,
    SUM(Qty) AS Sum_Qty 
    from dbo.Inventory GROUP BY Item,Color with cube


    2. 对于 ROLLUP ------======
    select 
    CASE WHEN Grouping(Item) = 1 
    Then '汇总' ELSE ISNULL(Item,'未知') 
    End as Item,
    CASE WHEN Grouping(Color) = 1 Then '汇总' ELSE ISNULL(Color,'未知') End as Item,
    SUM(Qty) AS Sum_Qty 
    from dbo.Inventory GROUP BY Item,Color with rollup

    3.怎样返回指定维度的 汇总:
    1。 使用派生表 然后 对派生表 做 where 条件筛选
    即 把上面汇总的 select 查询语句做成一个 子查询数据集
    然后从这个 数据集中 筛选 Item is not null and Color is null 诸如此类的。
    2.   使用GROUPING SETS 指定仅需要获取所需的分组

    不带 null, null 这种情况的:



    带上 null , null 这种情况的 

    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    JAVA版SqlHelper
    JAVA中的继承特点1
    C# SqlBulkCopy类批量导入数据
    动态注册HttpModule管道,实现global.asax功能
    实现自己的前端模板轻量级框架
    事务消息中心-TMC
    Win10应用设计的那些事儿
    考拉定时任务框架kSchedule
    如何玩转基于风险的测试
    谈谈Java异常处理这件事儿
  • 原文地址:https://www.cnblogs.com/Frank99/p/5399987.html
Copyright © 2011-2022 走看看