• 第八章 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 这种情况的 
    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 这种情况的 
    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    jdk和jre有什么区别?
    Apache的作用及意义
    博客园新成员的第一天
    重构改善既有代码的设计--简化条件表达式
    SourceMonitor: 代码重构的小工具,大用场
    使用Eclipse中提供的Refactor(重构)工具
    极大提高Web开发效率的8个工具和建议(含教程)
    Hbase shell命令
    Java多线程-新特性-有返回值的线程
    Java多线程-新特征-条件变量
  • 原文地址:https://www.cnblogs.com/Frank99/p/5319655.html
Copyright © 2020-2023  润新知