CUBE、ROLLUP、 GROUPING用法

浏览: 1779

首先,造数据

IF OBJECT_ID('t_test','U') IS NOT NULL

DROP TABLE t_test;

CREATE TABLE t_test

(

  id INT ,

  productName VARCHAR(200) ,

  price MONEY ,

  quantity INT ,

  amount INT ,

  orderdate DATETIME

)

GO

--插入随机数据

DECLARE @i INT 

DECLARE @price MONEY

DECLARE @date DATETIME

DECLARE @p INT 

DECLARE @DateBase INT 

DECLARE @Num int

SET @date = '2016-7-1'

SET @i = 1

WHILE ( @i < 20 ) 

    BEGIN

        SET @price= RAND() * 20

        SET @p = CEILING(RAND() * 10)

        SET @DateBase = CAST(RAND() * 10 AS INT)

        SET @Num=RAND()*100

        INSERT  INTO t_test (id, productName, price, quantity, amount, orderdate )

        VALUES  ( @i, CHAR(97+@p), @price, @Num,

                  @price * @Num, @date + @DateBase )

        SET @i = @i + 1

    END

  

SELECT  *  FROM  t_test

Clipboard Image.png


一、先看下ROLLUP的用法:

Clipboard Image.png                         Clipboard Image.png

从以上两个截图可以看出,ROLLUP是 按照分组顺序,先对group by 后面的第一个字段进行分组,在组内进行统计,最后给出总的合计。

ps:

SELECT  orderdate,

productName, 

SUM(amount) / SUM(quantity) AS avg_price, 

SUM(quantity) AS total_quantity,

SUM(amount) AS total_amount

 FROM    t_test

 GROUP BY ROLLUP(orderdate, productName);  等同于 GROUP BY orderdate, productName WITH ROLLUP;




二、再看CUBE的用法:

SELECT orderdate,

             productName,

             SUM(amount) AS total_amount

FROM t_test

GROUP BY productName,

                  orderdate

WITH CUBE 

结果如下:

Clipboard Image.png

从结果可以看出,CUBE是对group by 后面的所有字段都分别进行组内统计,然后再给出总的合计。


三、GROUPING用法:

Grouping(字段名) 用来区分当前行是不是cube 或 rollup产生的统计行,一般和cube 或 rollup同时使用

Grouping(字段名)=1 说明是统计行,Grouping(字段名)=0 说明不是统计行



 SELECT  CASE WHEN GROUPING(orderdate) = 1 THEN N'小计'

              ELSE CONVERT(VARCHAR(10), orderdate, 120)

         END AS orderdate, 

CASE WHEN GROUPING(productName) = 1 THEN N'小计'

              ELSE productName

         END AS productName, 

SUM(amount) / SUM(quantity) AS avg_price, 

SUM(quantity) AS total_quantity,

         SUM(amount) AS total_amount

 FROM    t_test

 GROUP BY orderdate, productName  

 WITH CUBE; 


结果如下:

Clipboard Image.png

推荐 0
本文由 hmily1023 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册