compute by 子句一般用在哪些场合呀。返回的是两个结果集,而且列数也不同呀?
------------------------------------------------------
今天看书,发现这个子句的功能太好了,又可以显示明细记录,就可以在最后显示合计数(如sum(),avg()的统计结果),
但是我一测试才发现,不是这么回事,
1.这个查询语句竟然返回两个结果集,而且列数不同。这有什么用呀,我的客户端(比如用vb编写的c/s程序)用记录集取结果集时,两个返回结果我如何取呀,
2.这个语句在查询分析器中是有用,可以查到最后的合计,但是好象在编程方面,没有什么可利用性呀,
请大家指教。
------------------------------------------------------
今天看书,发现这个子句的功能太好了,又可以显示明细记录,就可以在最后显示合计数(如sum(),avg()的统计结果),
但是我一测试才发现,不是这么回事,
1.这个查询语句竟然返回两个结果集,而且列数不同。这有什么用呀,我的客户端(比如用vb编写的c/s程序)用记录集取结果集时,两个返回结果我如何取呀,
2.这个语句在查询分析器中是有用,可以查到最后的合计,但是好象在编程方面,没有什么可利用性呀,
请大家指教。
COMPUTE 或 COMPUTE BY 运算符,这两者也与 GROUP BY 相关联。
这些运算符生成的结果集中,既包含每个项目的明细行,也包含每个组的汇总行,汇总行显示了该组的聚合合计。GROUP BY 子句可用于生成只包含各组聚合而不包含明细行的结果。建议应用程序使用 Analysis Services,而不要使用 CUBE、ROLLUP、COMPUTE 或 COMPUTE BY。CUBE 和 ROLLUP 应当只用在无法访问 OLE DB 或 ADO 的环境中,例如脚本或存储过程中。支持 COMPUTE 和 COMPUTE BY 是为了向后兼容。应优先选用 ROLLUP 而非 COMPUTE 或 COMPUTE BY。COMPUTE 或 COMPUTE BY 生成的汇总值作为分离的结果集返回,这些结果集之间还插入了各组明细行结果集;或者作为包含合计的结果集返回,追加在主结果集之后。处理这些多重结果集增加了应用程序代码的复杂性。COMPUTE 和 COMPUTE BY 都不支持服务器游标,而 ROLLUP 则支持。CUBE 和 ROLLUP 将生成单个结果集,其中包含嵌入的小计和合计行。并且,有时查询优化器为 ROLLUP 生成的执行计划比为 COMPUTE 和 COMPUTE BY 生成的更为高效。当使用不带这些运算符的 GROUP BY 时,将返回单个结果集,其中每组一行,行中包含该组的聚合小计。结果集中没有明细行。
------------------------------------
能引深的说一下,为什么不建议使用吗?
compute 子句我知道不好用,为了兼容,
那 cube ,rollup呢?
--> 测试时间:2009-07-10
--> 我的淘宝:http://shop36766744.taobao.com/if object_id('[Inventory]') is not null drop table [Inventory]
create table [Inventory]([Item] varchar(5),[Color] varchar(4),[Quantity] int)
insert [Inventory]
select 'Table','Blue',124 union all
select 'Table','Red',223 union all
select 'Chair','Blue',101 union all
select 'Chair','Red',210--COMPUTE事例
select * from [Inventory] order by Item COMPUTE sum(Quantity) /*
Item Color Quantity
----- ----- -----------
Chair Blue 101
Chair Red 210
Table Blue 124
Table Red 223 sum
===========
658
(所影响的行数为 5 行)*/--COMPUTE by事例
select * from [Inventory] order by Item COMPUTE sum(Quantity) by Item
/*
Item Color Quantity
----- ----- -----------
Chair Blue 101
Chair Red 210 sum
===========
311
Item Color Quantity
----- ----- -----------
Table Blue 124
Table Red 223 sum
===========
347
(所影响的行数为 6 行)
*/--With rollup
select Item,Color,s=sum(Quantity) from Inventory group by Item,Color With rollup/*
Item Color s
----- ----- -----------
Chair Blue 101
Chair Red 210
Chair NULL 311
Table Blue 124
Table Red 223
Table NULL 347
NULL NULL 658(所影响的行数为 7 行)*/--with cube
select item,color,sum(Quantity) qtysum from Inventory group by item,color with cube/*
item color qtysum
----- ----- -----------
Chair Blue 101
Chair Red 210
Chair NULL 311
Table Blue 124
Table Red 223
Table NULL 347
NULL NULL 658
NULL Blue 225
NULL Red 433(所影响的行数为 9 行)*/drop table Inventory