compute by 子句一般用在哪些场合呀。返回的是两个结果集,而且列数也不同呀?
------------------------------------------------------
今天看书,发现这个子句的功能太好了,又可以显示明细记录,就可以在最后显示合计数(如sum(),avg()的统计结果),
但是我一测试才发现,不是这么回事,
1.这个查询语句竟然返回两个结果集,而且列数不同。这有什么用呀,我的客户端(比如用vb编写的c/s程序)用记录集取结果集时,两个返回结果我如何取呀,
2.这个语句在查询分析器中是有用,可以查到最后的合计,但是好象在编程方面,没有什么可利用性呀,
请大家指教。

解决方案 »

  1.   

    生成简单汇总报表的应用程序可使用下列 Transact-SQL 元素: CUBE 或 ROLLUP 运算符,这两者均是 SELECT 语句的 GROUP BY 子句的一部分。
    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 时,将返回单个结果集,其中每组一行,行中包含该组的聚合小计。结果集中没有明细行。
      

  2.   

    建议应用程序使用 Analysis Services,而不要使用 CUBE、ROLLUP、COMPUTE 或 COMPUTE BY。CUBE 和 ROLLUP 应当只用在无法访问 OLE DB 或 ADO 的环境中,例如脚本或存储过程中。
    ------------------------------------
    能引深的说一下,为什么不建议使用吗?
    compute 子句我知道不好用,为了兼容,
    那 cube ,rollup呢?
      

  3.   


    --> 测试时间: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