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則爲順序排序。