GROUP BY 是分組查詢, 一般 GROUP BY 是和 聚合函數配合使用,你可以想想
你用了GROUP BY 按 ITEM.ITEMNUM 這個字段分組,那其他字段內容不同,變成一對多又改如何顯示呢,比如下面所示
A B
1 abc
1 bcd
1 asdfg
select A,B from table group by A
你說這樣查出來是什麼結果,
A B
abc
1 bcd
asdfg
右邊3條如何變成一條,所以需要用到聚合函數,比如
select A,count(B) 數量 from table group by A
這樣的結果就是
A 數量
1 3
group by 有一個原則,就是 select 後面的所有列中,沒有使用聚合函數的列,必須出現在 group by 後面
GROUP BY 是分組查詢, 一般 GROUP BY 是和 聚合函數配合使用,你可以想想
你用了GROUP BY 按 ITEM.ITEMNUM 這個字段分組,那其他字段內容不同,變成一對多又改如何顯示呢,比如下面所示
A B
1 abc
1 bcd
1 asdfg
select A,B from table group by A
你說這樣查出來是什麼結果,
A B
abc
1 bcd
asdfg
右邊3條如何變成一條,所以需要用到聚合函數,比如
select A,count(B) 數量 from table group by A
這樣的結果就是
A 數量
1 3
group by 有一個原則,就是 select 後面的所有列中,沒有使用聚合函數的列,必須出現在 group by 後面
1、最常用的就是這種語法,如下:Select CategoryID, AVG(UnitPrice), COUNT(UnitPrice) FROM dbo.Products Where UnitPrice > 30GROUP BY CategoryID ORDER BY CategoryID DESC這個語句查詢出,所有產品分類的產品平均單價,單價計數。並且單價在 30 以上的記錄。2、再看看這種語法,如下:Select CategoryID, AVG(DISTINCT UnitPrice), COUNT(DISTINCT UnitPrice) FROM dbo.Products Where UnitPrice > 30GROUP BY CategoryID ORDER BY CategoryID DESC使用 DISTINCT 的時候,將會去除重復的價格平均單價。3、如果希望在分類統計之後,再使用條件過濾,下面的語句可以做為參數:Select CategoryID, SUM(UnitPrice) AS SumPriceFROM dbo.ProductsGROUP BY CategoryIDHAVING SUM(UnitPrice) > 300HAVING 與 Where 語句類似,Where 是在分類之前過濾,而 HAVING 是在分類之後過濾。它和 Where 一樣使用 AND、OR、NOT、LIKE 組合使用。4、如果希望再在分類統計中,添加匯總行,可以使用以下語句:Select CategoryID, SUM(UnitPrice), GROUPING(CategoryID) AS 'Grouping'FROM dbo.ProductsGROUP BY CategoryID WITH ROLLUPGrouping 這一列用於標識出哪一行是匯總行。它使用 ROLLUP 操作添加匯總行。5、如果使用 WITH CUBE 將會產生一個多維分類數據集,如下:Select CategoryID, SupplierID, SUM(UnitPrice) AS SumPriceFROM dbo.ProductsGROUP BY CategoryID, SupplierID WITH CUBE 它會產生一個交叉表,產生所有可能的組合匯總。6、使用 ROLLUP CUBE 會產生一個 NULL 空值,可以使用以下語法解決,如下:Select CASE WHEN (GROUPING(SupplierID) = 1) THEN '-1' ELSE SupplierID END AS SupplierID, SUM(UnitPrice) AS QtySumFROM dbo.ProductsGROUP BY SupplierID WITH CUBE