程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server數據匯總五招輕松弄定

SQL Server數據匯總五招輕松弄定

編輯:MSSQL

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子句對匯總數據停止特定的過濾。願望下次你須要匯總一些數據的時刻,你可以加倍輕易的到達目標。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved