group by 這個關鍵字,這個語句太平凡了~基本上只要有報表的地方,就會有它的身影。 常規用法就是 INSERT INTO #TypeValue ( TypeID, Col2 ) VALUES (1 , N'名稱1'),(1 , N'名稱2'),(2 , N'名稱3'),(2, N'名稱3'),
group by 這個關鍵字,這個語句太平凡了~基本上只要有報表的地方,就會有它的身影。
常規用法就是
INSERT INTO #TypeValue ( TypeID, Col2 ) VALUES (1 , N'名稱1'),(1 , N'名稱2'),(2 , N'名稱3'),(2, N'名稱3'),(3 , N'名稱4'),(3 , N'名稱5'),(4 , N'名稱6'),(4 , N'名稱6'),(5 , N'名稱7') SELECT TypeID,Col2,COUNT(*) AS Qty FROM #TypeValue GROUP BY TypeID,Col2 TypeID Col2 Qty ----------- -------------------------------------------------- ----------- 1 名稱1 1 1 名稱2 1 2 名稱3 2 3 名稱4 1 3 名稱5 1 4 名稱6 2 5 名稱7 1
一個語法原則就是,除非用到聚合的關鍵字或者常量(比如 count啊,sum啊,AVG啊之類的),其它出現的欄位都必須出現在 group by 之後,並且不能用別名,就比如隨便改一下上面那個句子,這裡面只能把整個case 放到group by 裡面,而並不能直接group by DisplayName 。就是這個道理
SELECT TypeID,CASE WHEN Col2 IN ('名稱1','名稱2') THEN 1 WHEN Col2 IN ('名稱3','名稱4') THEN 2 WHEN Col2 IN ('名稱5','名稱6') THEN 3 ELSE 4 END AS DisplayName,COUNT(*) AS Qty FROM #TypeValue GROUP BY TypeID,CASE WHEN Col2 IN ('名稱1','名稱2') THEN 1 WHEN Col2 IN ('名稱3','名稱4') THEN 2 WHEN Col2 IN ('名稱5','名稱6') THEN 3 ELSE 4 END
還有一個不大規範的用法 Group By ALL 這個用法,在未來的版本應該會廢除,但是廢除之前呢~還是可以用的(只是一般不建議),我也介紹一下。這個All 的場景很簡單,就是在查詢聚合的時候。在where 的限定條件裡面過濾了一部分的數據。但是對於聚合的行數是沒有任何的影響的,看個實例你就會明白
SELECT TypeID,Col2,COUNT(*) AS Qty FROM #TypeValue WHERE TypeID < 4 GROUP BY TypeID,Col2 TypeID Col2 Qty ----------- -------------------------------------------------- ----------- 1 名稱1 1 1 名稱2 1 2 名稱3 2 3 名稱4 1 3 名稱5 1 SELECT TypeID,Col2,COUNT(*) AS Qty FROM #TypeValue WHERE TypeID < 4 GROUP BY ALL TypeID,Col2 TypeID Col2 Qty ----------- -------------------------------------------------- ----------- 1 名稱1 1 1 名稱2 1 2 名稱3 2 3 名稱4 1 3 名稱5 1 4 名稱6 0 5 名稱7 0
第一個語句在查詢出來的結果,位元組把TypeID >=4 的,直接就不返回了。而第二個語句,TypeID >= 4 的,還留下個框架在。這個就是加了 All 關鍵字的影響。
還有一些可能用到的.比方說cube 。效果就是在group by 的每一項,從右到左都生成一個聚合行。簡單舉例又來改一下我們例子的語句。當中有些Null的行,對!就是聚合出來的啦~最後還有一個全部的總聚合╮(╯_╰)╭
SELECT TypeID,Col2,COUNT(*) AS Qty FROM #TypeValue GROUP BY ROLLUP (TypeID,Col2)
TypeID Col2 Qty ----------- -------------------------------------------------- ----------- 1 名稱1 1 1 名稱2 1 1 NULL 2 2 名稱3 2 2 NULL 2 3 名稱4 1 3 名稱5 1 3 NULL 2 4 名稱6 2 4 NULL 2 5 名稱7 1 5 NULL 1 NULL NULL 9
當然羅,有的伙伴說,然而我只需要你把總數聚合出來就ok啦!其它結果集臣妾不需要啊!OK啊,改下就行了啊~需要的是將 Rollup後面的子集用 () 包起來,因為這裡面是判斷集合的~so ~就行了,還有一個 ,當使用rollup 的時候,會有一個Grouping的行數標誌是否是rollup 產生的聚合行~如果需要對聚合行賦值~註意數據類型的轉換哦~
SELECT CASE WHEN GROUPING(TypeID) = 1 THEN '合計' ELSE RTRIM(TypeID) END AS TypeID, Col2,COUNT(*) AS Qty FROM #TypeValue GROUP BY ROLLUP ((TypeID,Col2)) TypeID Col2 Qty ------------ -------------------------------------------------- ----------- 1 名稱1 1 1 名稱2 1 2 名稱3 2 3 名稱4 1 3 名稱5 1 4 名稱6 2 5 名稱7 1 合計 NULL 9
好~今天說道這裡~祝各位元宵節闔家安康