SQL SEVER (ROLLUP與CUBE,ROW_NUMBER())使用方法

 

1.創建測試專用數據;測試

if object_id('TESTDB') is not null drop table TESTDB

create table TESTDB(A varchar(8), B INT)

insert into TESTDB

select 'A1', 6 union all

select 'A1', 8 union all

select 'A1', 67 union all

select 'A2', 67 union all

select 'A2', 4 union all

select 'A2', 112 union all

select 'A3', 90 union all

 

此處:能夠用SELECT 與 UNION聯合的插入方法,方便快捷,前提是插入數據的列與表的列相同;spa

2.ROW_NUMBER() 使用code

   ROW_NUMBER()的使用,主要是對數據進行分組時,對組內的數據進行排序,對臨時表的內容進行測試,語句以下:blog

   

SELECT * ,ROW_NUMBER() OVER( PARTITION BY A ORDER BY B DESC) NUM FROM TESTDB GROUP BY A,B 

 

 

 

執行結果以下:排序

分析:語句根據A、B進行分組,分組後內部按照A進行分區,B列進行排序,增添NUM計數信息;io

3.ROLLUP 與 CUBE 的對比table

首先:對於進行ROULLUP排序;class

SELECT * ,ROW_NUMBER() OVER( PARTITION BY A ORDER BY B DESC) NUM FROM TESTDB GROUP BY A,B WITH ROLLUP

 

分析:與無ROLLUP對比,多出來了四行數據,四行數據分別爲:object

1).單獨對A進行分組,忽略B對其用NULL代替;select

2)忽略A、B進行分組,即多出一行空值;

以此類推的話:若是是三列A、B、C進行ROLLUP的話,應該是先對A進行分組,再對A、B分組,最後是A、B、C均不考慮就是空值一行,隨後測試猜測;對錶進行列的增長;

create table TESTDB(A varchar(8), B INT,C varchar(8))

insert into TESTDB

select 'A1', 6,'A' union all

select 'A1', 8,'B' union all

select 'A1', 67,'C' union all

select 'A2', 67,'A' union all

select 'A2', 4 ,'B' union all

select 'A2', 112, 'C' union all

select 'A3', 90, 'D' union all
select 'A3', 6,'D'
SELECT * FROM TESTDB GROUP BY A,B,C WITH ROLLUP

 

      猜測正確,總結出規律爲:分別對group分組的列按照順序,依次組合進行分組,A、B、C則爲三個均不考慮,只考慮A,考慮A、B,考慮A、B、C排序即爲ROLLUP 的內在邏輯。

 4.CUBE的使用

    對兩列時進行CUBE排序與ROLLUP進行對比

 

SELECT * ,ROW_NUMBER() OVER( PARTITION BY A ORDER BY B DESC) NUM FROM TESTDB GROUP BY A,B WITH CUBE

 

 

 

 

 

對比得知:CUBE排序方式爲

                       GROUP BY   A

                       GROUP BY B

                       GROUP BY A、B

                       NULL行

              ROLLUP爲: 

                        NULL行

                        GROUP BY   A

                       GROUP BY A、B

CUBE要比ROLLUP分別排序的全,內部元素均會一一排序;ROLLUP則爲順序排序。

相關文章
相關標籤/搜索