SQL Server數據匯總五招輕松弄定。本站提示廣大學習愛好者:(SQL Server數據匯總五招輕松弄定)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server數據匯總五招輕松弄定正文
本文我們將評論辯論若何應用GROUPBY子句來匯總數據。
應用零丁列分組
GROUP BY子句經由過程設置分組前提來匯總數據,在第一個例子中,我在數據庫AdventureWork2012中的表 Sales.SalesOrderDetail.中的一列長進行數據分組操作。這個例子和其他例子都應用數據庫AdventureWorks2012,假如你想應用它運轉我的代碼,你可以點擊下載。
上面是第一個示例的源碼,在CarrierTrackingNumber列上應用group by子句停止數據分組操作
USE AdventureWorks2012; GO SELECT CarrierTrackingNumber ,SUM(LineTotal) AS SummarizedLineTotal FROM AdventureWorks2012.Sales.SalesOrderDetail GROUP BY CarrierTrackingNumber;
在我運轉這段代碼後,會獲得3807個記載,上面是這個宏大的成果集中前五個數值:
CarrierTrackingNumber LineTotal -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 6E46-440A-B5 2133.170700 B501-448E-96 4085.409800 8551-4CDF-A1 72616.524200 B65C-4867-86 714.704300 99CE-4ADA-B1 16185.429200
在下面的示例中,我應用group by子句選擇哪些列作為集合dventureWorks2012.Sales.SalesOrderDetai數據表數據的前提,在例子中,我應用CarrierTrackingNumber匯總數據,當你停止數據分組時,只要在group By 子句中湧現的列才在selection 列表中有用。在我的示例中,我應用集合函數SUM盤算LineTotal,為了應用便利,我為它設置了別號SummarizedLineTotal。
假如我想取得CarrierTrackingNumber 知足特定前提下的集合聚集,那我可以在Where子句中對查詢停止限制,就像我上面做的如許:
USE AdventureWorks2012; GO SELECT CarrierTrackingNumber ,SUM(LineTotal) AS SummarizedLineTotal FROM AdventureWorks2012.Sales.SalesOrderDetail WHERE CarrierTrackingNumber = '48F2-4141-9A' GROUP BY CarrierTrackingNumber;
這裡我在原始查詢基本上在where子句中加上了一條限制,我設置了我的查詢只前往CarrierTrackingNumber 等於一個特定值的成果。運轉這段代碼後,我會獲得記載中CarrierTrackingNumber 等於48F2-4141-9A的行的數目。Where子句的過濾行動在數據被集合之前就已失效。
經由過程多列來分組
有時刻你能夠須要應用多列來停止數據分組,上面是我應用多列停止分組的示例代碼
SELECT D.ProductID , H.OrderDate , SUM(LineTotal) AS SummarizedLineTotal FROM AdventureWorks2012.Sales.SalesOrderDetail D JOIN AdventureWorks2012.Sales.SalesOrderHeader H ON D.SalesOrderId = H.SalesOrderID GROUP BY ProductID, OrderDate;
查詢前往26878行數據,這是下面查詢前往的部門成果:
ProductID OrderDate LineTotal -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 714 2008-05-21 00:00:00.000 99.980000 859 2007-11-03 00:00:00.000 48.980000 923 2007-11-23 00:00:00.000 14.970000 712 2007-12-22 00:00:00.000 62.930000 795 2007-10-14 00:00:00.000 2443.350000 950 2007-07-01 00:00:00.000 2462.304000 795 2007-11-06 00:00:00.000 2443.350000 877 2007-11-19 00:00:00.000 15.900000 713 2007-10-01 00:00:00.000 99.980000 860 2008-05-31 00:00:00.000 48.980000 961 2008-05-01 00:00:00.000 36242.120880
在下面的示例法式中,Group by 子句頂用到了ProductID列與OrderDate列,SQL Server基於ProductID和OrderDate兩者組合的獨一性,前往LineTotal的值,並為其設置別號SummarizedLineTotal。假如你檢查法式的輸入,你會發明SQL Server 對數據停止分組後,前往的成果並沒有特定的次序,假如你須要前往成果依照必定次序排序,你須要應用ORDER BY 子句,就像我鄙人面代碼中展現的那樣。
SELECT D.ProductID , H.OrderDate , SUM(LineTotal) AS SummarizedLineTotal FROM AdventureWorks2012.Sales.SalesOrderDetail D JOIN AdventureWorks2012.Sales.SalesOrderHeader H ON D.SalesOrderId = H.SalesOrderID GROUP BY ProductID, OrderDate ORDER BY SummarizedLineTotal DESC;
在下面的代碼中,我依照SummorizedLineTotal降序對成果集停止排序,此列的值經由過程Group BY子句分組後對LineTotal應用聚合函數Sum獲得。我對成果依照SummorizedLineTotal 的值降序分列。假如你運轉此法式,你可以得出LineTotal 數目最高的ProductID和OrderDate。
對沒有任何值的數據停止分組
有時刻你會須要對一些記載中包括空值的數據停止分組操作。當你在SQL Server 履行此類操作時,它會主動假定一切NULL值相等。讓我看一下上面的示例法式
CREATE TABLE NullGroupBy (OrderDate date, Amount Int); INSERT INTO NullGroupBy values (NULL,100), ('10-30-2014',100), ('10-31-2014',100), (NULL,100); SELECT OrderDate, SUM(Amount) as TotalAmount FROM NullGroupBy GROUP BY OrderDate; DROP TABLE NullGroupBy; When I run this code I get the following output: OrderDate TotalAmount -- -- -- -- -- -- -- -- -- -- - NULL 200 2014-10-30 100 2014-10-31 100
在下面的法式中,我起首創立並填充了一個NullGroupBy表.在這個表中,我放置了四個分歧的行,第一行和最初一行的orderDate列值為NULL,其他兩列的orderDate值分歧。從下面的輸入成果可以看到,SQL Server 在分組時將OrderDate為NULL的兩行集合為一行處置。
在Group BY 子句中應用表達式
有時你須要在Group by子句中應用表達式,而不是詳細的列。SQL Server許可你在Group By子句中指定一個表達式,就像上面的代碼中所示:
SELECT CONVERT(CHAR(7),H.OrderDate,120) AS [YYYY-MM] , SUM(LineTotal) AS SummarizedLineTotal FROM AdventureWorks2012.Sales.SalesOrderDetail D JOIN AdventureWorks2012.Sales.SalesOrderHeader H ON D.SalesOrderId = H.SalesOrderID GROUP BY CONVERT(CHAR(7),H.OrderDate,120) ORDER BY SummarizedLineTotal DESC;
上述代碼應用OrderDate 列中的年代數據停止分組,經由過程應用表達式CONVERT(CHAR(7),H.OrderDate,120) ,我告知SQL辦事器截取OrderDate ODBC尺度日期格局的前七個字符,也就是OrderDate yyyy-mm部門。基於這個表達式,我可以找出特定年代的total SummarizeLineTotal值,在Group By子句中應用表達式,和對LineTotal值排序,我可以找出哪一年哪個月的SummarizeLineTotal最年夜或最小。
應用HAVING子句過濾數據
Having 是別的一個能與Group BY 子句聯合應用的主要子句,應用Having 子句,你可以過濾失落不相符Having子句所接表達式的數據行,當我在其上應用where子句時,在集合之前就會發生過濾行動。Having 子句許可你基於某些尺度過濾聚合行。想要更清晰地懂得Having子句,請參考上面代碼:
SELECT D.ProductID , H.OrderDate , SUM(LineTotal) AS SummarizedLineTotal FROM AdventureWorks2012.Sales.SalesOrderDetail D JOIN AdventureWorks2012.Sales.SalesOrderHeader H ON D.SalesOrderId = H.SalesOrderID GROUP BY ProductID, OrderDate HAVING SUM(LineTotal) > 200000 ORDER BY SummarizedLineTotal DESC;
在下面的代碼中Having子句限制前提是SUM(LineTotal) > 200000。這個having子句包管終究成果中LineTotal的聚合值(SummarizedLineTotal)年夜於200000.經由過程應用having子句,我的查詢只前往一行數據,其SummarizedLineTotal年夜於200000.having子句許可SQL Server 只前往聚合成果知足Having子句限制的前提的數據行。
總結
很多運用請求數據在展現之前要經由必定的匯總操作,GROUP BY子句就是SQL Server供給的匯總數據的機制。GROUPBY子句許可你應用HAVING子句對匯總數據停止特定的過濾。願望下次你須要匯總一些數據的時刻,你可以加倍輕易的到達目標。