retmxls-- 商品銷售明細表
rq--日期
spid--商品信息
sshje--每筆銷售記錄的金額
select spid,rq, sum(sshje) from retmxls group by rq,spid with ROLLUP order by spid
根據group by 後的第一個字段進行分組,我這裏的是rq,那就是同日期的爲一組,並在這一組完的最後一行插入一個空行,顯示這個組的sshje 的彙總
select spid,rq, sum(sshje) from retmxls group by spid,rq with cube order by spid
根據group by 後的每一個字段進行分組,並在這一組完的最後一行插入一個空行,顯示這個組的sshje 的彙總
下圖的結果中有2026.6這個是2005-05-01這個日期的所有商品的彙總額,而4702.58是整個表的所有商品所
有日期的總彙總,而206.66是SPH10000002在所有天的彙總。
select spid,rq,sshje from retmxls order by rq compute sum(sshje)
對compute 後的sum字段進行彙總,返回明細和一個彙總兩個結果
select spid,rq,sshje from retmxls order by rq compute sum(sshje) by (rq)
對compute 後的sum字段進行彙總,對by後的字段進行分組,返回由日期分組後的每個明細和每個彙總的多個結果
下面再說幾個比較有用的排名函數(RANK ()、NTILE (integer_expression)、row_number() 、DENSE_RANK)
1、RANK ()
語法
RANK ( ) OVER ( [ < partition_by_clause > ] < order_by_clause > )
參數
< partition_by_clause>
將 FROM 子句生成的結果集劃分成 RANK 函數適用的分區。若要了解 PARTITION BY 語法,請參閱 OVER 子句 (Transact-SQL)。
< order_by_clause>
確定將 RANK 值應用於分區中的行時所基於的順序。有關詳細信息,請參閱 ORDER BY 子句 (Transact-SQL)。當在排名函數中使用 <order_by_clause> 時,不能用整數表示列。
示列:select rank () over(PARTITION BY sshje order by spid) as r,spid,sshje from retmxls結果生成以sshje分區,按spid排序的序號,返回結果同一spid序號一樣,下一序號從實際行號開始。而不是上一序號加1
也可以select rank () over(order by spid) as r,spid,sshje from retmxls
返回結果同一spid序號一樣,下一序號從實際行號開始。而不是上一序號加1
2、NTILE (integer_expression)
語法
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )
參數
integer_expression
一個正整數常量表達式,用於指定每個分區必須被劃分成的組數。
integer_expression 的類型可以爲 int 或 bigint。
<partition_by_clause>
將 FROM 子句生成的結果集劃分成 RANK 函數適用的分區。
< order_by_clause>
確定 NTILE 值分配到分區中各行的順序。有關詳細信息,請參閱 ORDER BY 子句 (Transact-SQL)。當在排名函數中使用 <order_by_clause> 時,不能用整數表示列。
示列:select NTILE (4) over(PARTITION BY sshje order by spid) as r,spid,sshje from retmxls
根據sshje進行分區,按照spid進行排序,把每個分區分成4份
也可以select NTILE (4) over(order by spid) as r,spid,sshje from retmxls
將整個結果分成四份
3、DENSE_RANK ( )
語法
DENSE_RANK ( ) OVER ( [ < partition_by_clause > ] < order_by_clause > ) |
參數
< partition_by_clause>
將 FROM 子句生成的結果集劃分爲數個應用 DENSE_RANK 函數的分區。若要了解 PARTITION BY 語法,請參閱 OVER 子句 (Transact-SQL)。
< order_by_clause>
確定將 DENSE_RANK 值應用於分區中各行的順序。整數不能表示排名函數中使用的 <order_by_clause> 中的列。
示列:select DENSE_RANK() over( order by spid) as r,spid,sshje from retmxls
返回結果同NTILE的區別是他的下一區的序號是上一區的數值加1而不是實際的行數。
select DENSE_RANK() over(PARTITION BY sshje order by spid) as r,spid,sshje from retmxls
生成結果根據sshje分區,spid排序,生成序號,序號是連續的順序
4、row_number()
語法
ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> ) |
參數
<partition_by_clause>
將 FROM 子句生成的結果集劃入應用了 ROW_NUMBER 函數的分區。若要了解 PARTITION BY 語法,請參閱 OVER 子句 (Transact-SQL)。
<order_by_clause>
確定將 ROW_NUMBER 值分配給分區中的行的順序。有關詳細信息,請參閱 ORDER BY 子句 (Transact-SQL)。當在排名函數中使用 <order_by_clause> 時,不能用整數表示列。
示列:select row_number() over(order by spid) as r,spid,sshje from retmxls
生成結果,以spid排序,生成連續的序號。和標識種子類似
select row_number() over(PARTITION BY sshje order by spid) as r,spid,sshje from retmxls
生成以sshje分區的序號,每個分區從1開始