上面结果中,第 1、2、3、7、10、12 行称为超级分组记录(super group row)。
(2)用 ROLLUP + GROUPING SELECT CASE WHEN GROUPING(product_type) = 1 THEN '商品种类 合计' ELSE product_type END AS product_type, CASE WHEN GROUPING(regist_date) = 1 THEN '登记日期 合计' ELSE CAST(regist_date AS VARCHAR(16)) END AS regist_date, SUM(sale_price) AS sum_price FROM Product GROUP BY ROLLUP(product_type, regist_date);上面 (1)只用 ROLLUP 的例子,超级分组记录都存在 null 数据的情况,为了避免阅读的混淆,SQL 提供了一个用来判断超级分组记录的 NULL 的特定函数—— GROUPING 函数。该函数在其参数列的值为超级分组记录所产生的 NULL 时返回 1 ,其他情况返回 0。
结果:
product_type regist_date sum_price商品种类 合计 登记日期 合计 16780
厨房用具 登记日期 合计 11180
厨房用具 2008-04-28 880
厨房用具 2009-01-15 6800
厨房用具 2009-09-20 3500
办公用品 登记日期 合计 600
办公用品 2009-09-11 500
办公用品 2009-11-11 100
衣服 登记日期 合计 5000
衣服 2009-09-20 1000
衣服 4000
2、CUBE——用数据来搭积木
上面 (2)用 ROLLUP + GROUPING 的例子,直接把 ROLLUP 改写成 CUBE 就行:
SELECT CASE WHEN GROUPING(product_type) = 1 THEN '商品种类 合计' ELSE product_type END AS product_type, CASE WHEN GROUPING(regist_date) = 1 THEN '登记日期 合计' ELSE CAST(regist_date AS VARCHAR(16)) END AS regist_date, SUM(sale_price) AS sum_price FROM Product GROUP BY CUBE(product_type, regist_date);GROUP BY CUBE (product_type, regist_date); 的结果等于
① GROUP BY ()
② GROUP BY (product_type)
③ GROUP BY (regist_date) ←新添的组合
④ GROUP BY (product_type, regist_date)
三者的 UNION。
CUBE 生成的 GROUP BY 组合,是 2 的 n 次方(n 是聚合键的个数)。
这就是 CUBE 如此起名的由来。
结果(第3-8行是比之前多出来的):
product_type regist_date sum_price商品种类 合计 登记日期 合计 16780
商品种类 合计 2008-04-28 880
商品种类 合计 2009-01-15 6800
商品种类 合计 2009-09-11 500
商品种类 合计 2009-09-20 4500
商品种类 合计 2009-11-11 100
商品种类 合计 4000
厨房用具 登记日期 合计 11180
厨房用具 2008-04-28 880
厨房用具 2009-01-15 6800
厨房用具 2009-09-20 3500
办公用品 登记日期 合计 600
办公用品 2009-09-11 500
办公用品 2009-11-11 100
衣服 登记日期 合计 5000
衣服 2009-09-20 1000
衣服 4000
3、GROUPING SETS——取得期望的积木
因为 GROUPING SETS 会获得不固定结果,因此与 ROLLUP 或者CUBE 比起来,使用GROUPING SETS 的机会很少。
这里姑且略过。
第 9 章 通过应用程序连接数据库 1、驱动驱动就是应用和数据库这两个世界之间的桥梁。
2、驱动标准