Item Color Quantity -------------------- -------------------- -------------------------- Table Blue 124 Table Red 223 Chair Blue 101 Chair Red 210下列查询返回的结果集中,将包含 [b]Item[/b] 和 [b]Color[/b] 的所有可能组合的 [b]Quantity[/b] 小计:
SELECT Item, Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH CUBE下面是结果集:
Item Color QtySum -------------------- -------------------- -------------------------- Chair Blue 101.00 Chair Red 210.00 Chair (null) 311.00 Table Blue 124.00 Table Red 223.00 Table (null) 347.00 (null) (null) 658.00 (null) Blue 225.00 (null) Red 433.00我们着重考查下列各行:
Chair (null) 311.00这一行报告了 [b]Item[/b] 维度中值为 Chair 的所有行的小计。对 [b]Color[/b] 维度返回了 NULL 值,表示该行所报告的聚合包括 [b]Color[/b] 维度为任意值的行。
Table (null) 347.00这一行类似,但报告的是 [b]Item[/b] 维度中值为 Table 的所有行的小计。
(null) (null) 658.00这一行报告了多维数据集的总计。[b]Item[/b] 和 [b]Color[/b] 维度的值都是 NULL,表示两个维度中的所有值都汇总在该行中。
(null) Blue 225.00 (null) Red 433.00这两行报告了 [b]Color[/b] 维度的小计。两行中的 [b]Item[/b] 维度值都是 NULL,表示聚合数据来自 [b]Item[/b] 维度为任意值的行。
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL' ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH CUBE
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item WITH CUBEGO此 SELECT 语句返回的结果集既显示了 [b]Item[/b] 中每个值的小计,也显示了 [b]Item[/b] 中所有值的总计:
Item QtySum -------------------- -------------------------- Chair 311.00 Table 347.00 ALL 658.00包含带有许多维度的 CUBE 的 SELECT 语句可能生成很大的结果集,因为这些语句会为所有维度中值的所有组合生成行。这些大结果集包含的数据可能过多而不易于阅读和理解。这个问题有一种解决办法是将 SELECT 语句放在视图中:
CREATE VIEW InvCube ASSELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL' ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH CUBE然后即可用该视图来只查询您感兴趣的维度值:
SELECT *FROM InvCubeWHERE Item = 'Chair' AND Color = 'ALL'Item Color QtySum -------------------- -------------------- -------------------------- Chair ALL 311.00 (1 row(s) affected)
Item Color Quantity -------------------- -------------------- -------------------------- Table Blue 124 Table Red 223 Chair Blue 101 Chair Red 210下列查询将生成小计报表:
SELECT CASE WHEN (GROUPING(Item) = 1) THEN 'ALL' ELSE ISNULL(Item, 'UNKNOWN') END AS Item, CASE WHEN (GROUPING(Color) = 1) THEN 'ALL' ELSE ISNULL(Color, 'UNKNOWN') END AS Color, SUM(Quantity) AS QtySumFROM InventoryGROUP BY Item, Color WITH ROLLUPItem Color QtySum -------------------- -------------------- -------------------------- Chair Blue 101.00 Chair Red 210.00 Chair ALL 311.00 Table Blue 124.00 Table Red 223.00 Table ALL 347.00 ALL ALL 658.00 (7 row(s) affected)如果查询中的 ROLLUP 关键字更改为 CUBE,那么 CUBE 结果集与上述结果相同,只是在结果集的末尾还会返回下列两行:
ALL Blue 225.00 ALL Red 433.00CUBE 操作为 [b]Item[/b] 和 [b]Color[/b] 中值的可能组合生成行。例如,CUBE 不仅报告与 [b]Item[/b] 值 Chair 相组合的 [b]Color[/b] 值的所有可能组合(Red、Blue 和 Red + Blue),而且报告与 [b]Color[/b] 值 Red 相组合的 [b]Item[/b] 值的所有可能组合(Chair、Table 和 Chair + Table)。 对于 GROUP BY 子句中右边的列中的每个值,ROLLUP 操作并不报告左边一列(或左边各列)中值的所有可能组合。例如,ROLLUP 并不对每个 [b]Color[/b] 值报告 [b]Item[/b] 值的所有可能组合。 ROLLUP 操作的结果集具有类似于 COMPUTE BY 所返回结果集的功能;然而,ROLLUP 具有下列优点: [list] [*]ROLLUP 返回单个结果集;COMPUTE BY 返回多个结果集,而多个结果集会增加应用程序代码的复杂性。 [/*][*]ROLLUP 可以在服务器游标中使用;COMPUTE BY 不可以。 [/*][*]有时,查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE BY 生成的更为高效。 [/*][/list]
[code]USE pubsSELECT royalty, SUM(advance) 'total advance', GROUPING(royalty) 'grp'[/code] [code]FROM titles GROUP BY royalty WITH ROLLUP[/code]结果集在 [b]royalty [/b]下显示两个空值。第一个 NULL 代表从表中这一列得到的空值组。第二个 NULL 在 ROLLUP 操作所添加的汇总行中。汇总行显示的是所有 [b]royalty[/b] 组的 [b]advance[/b] 合计数值,并且在 [b]grp[/b] 列中用 1 标识。 下面是结果集:
[code]royalty total advance grp --------- --------------------- ---NULL NULL 0 10 57000.0000 0 12 2275.0000 0 14 4000.0000 0 16 7000.0000 0 24 25125.0000 0 NULL 95400.0000 1 [/code]
[code]USE pubsSELECT royalty, SUM(advance) 'total advance', GROUPING(royalty) 'grp'[/code] [code]FROM titles GROUP BY royalty WITH ROLLUP[/code]结果集在 [b]royalty [/b]下显示两个空值。第一个 NULL 代表从表中这一列得到的空值组。第二个 NULL 在 ROLLUP 操作所添加的汇总行中。汇总行显示的是所有 [b]royalty[/b] 组的 [b]advance[/b] 合计数值,并且在 [b]grp[/b] 列中用 1 标识。 下面是结果集:
[code]royalty total advance grp --------- --------------------- ---NULL NULL 0 10 57000.0000 0 12 2275.0000 0 14 4000.0000 0 16 7000.0000 0 24 25125.0000 0 NULL 95400.0000 1 [/code]
[code]USE pubsSELECT royalty, SUM(advance) 'total advance', GROUPING(royalty) 'grp'[/code] [code]FROM titles GROUP BY royalty WITH ROLLUP[/code]结果集在 [b]royalty [/b]下显示两个空值。第一个 NULL 代表从表中这一列得到的空值组。第二个 NULL 在 ROLLUP 操作所添加的汇总行中。汇总行显示的是所有 [b]royalty[/b] 组的 [b]advance[/b] 合计数值,并且在 [b]grp[/b] 列中用 1 标识。 下面是结果集:
[code]royalty total advance grp --------- --------------------- ---NULL NULL 0 10 57000.0000 0 12 2275.0000 0 14 4000.0000 0 16 7000.0000 0 24 25125.0000 0 NULL 95400.0000 1 [/code]对GROUPING,ROLLUP,CUBE的介绍来自SQL Server2000中文版的帮助.
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有