


使用SQL Server過濾數(shù)據(jù)的方法
關(guān)系型數(shù)據(jù)通常以規(guī)范化形式保存,就是說你應(yīng)該盡可能少地重復(fù)數(shù)據(jù);通常情況下,表與表之間僅通過各種鍵值實現(xiàn)關(guān)聯(lián)。進一步地講,規(guī)范化的含義就是:你不能在數(shù)據(jù)庫中保存計算后的值,而你只能在需要的時候臨時計算數(shù)據(jù)庫中保存的值。
對數(shù)據(jù)進行某些分析通常是很重要的。比方說,你或許想知道哪些產(chǎn)品的定單最多或者哪些定單的利潤最大。這些問題都要求你針對自己的SQL語句創(chuàng)建執(zhí)行過濾規(guī)則的公式。其中最重要的語句之一就是GROUP BY子句。
Northwind數(shù)據(jù)庫中的定單
Northwind數(shù)據(jù)庫是包含在SQL Server安裝軟件中的兩個示范數(shù)據(jù)庫。這個數(shù)據(jù)庫雖然談不上完美無缺但也足夠滿足我們討論GROUP BY語句的目的了。原因之一是它工作原理清晰,運行良好,包含了一整套標準的數(shù)據(jù)表,比如Customers(客戶)、Orders(定單)、Order Details(定單細節(jié))和處理定單的Products(產(chǎn)品)。
表的結(jié)構(gòu)模式
如果你想查看各個定單的OrderID和ProductID ,以下的SQL命令可以滿足要求:
SELECT o.OrderID, od.ProductIDFROM Orders o, [Order Details] od
WHERE o.OrderID = od.OrderID
這樣你就通過OrderID字段把Orders和Order Details連接了起來。給出的結(jié)果列表即顯示各定貨條目的OrderID和ProductID。
你可以從這個列表中找到條目數(shù)量最大的定單?墒,再想想,要能簡單地要求數(shù)據(jù)庫計算出需要的條目數(shù)目不更方便嗎?如果你不關(guān)心單個條目而只想知道訂購條目數(shù)量最大的定單,那么你可以采用以下的SQL語句:
SELECT o.OrderID, Count(od.ProductID) as NumItemsFROM Orders o, [Order Details] od
WHERE o.OrderID = od.OrderID
這樣就可以總計出產(chǎn)品的數(shù)量并用一個名為NumItems的新字段來顯示總數(shù)。可是,如果你執(zhí)行該語句則可能得到以下錯誤:
Server: Msg 8118, Level 16, State 1, Line 1
選擇語句中的'o.OrderID'列是無效的,因為它沒有包含在匯集函數(shù)之內(nèi)而且沒有相應(yīng)的GROUP BY 子句。
在這種情況下,你實際上在總計ProductID,但OrderID卻沒有被計算總和或者有其他操作施加于其上。
其實這個示例中計算的并不是訂購產(chǎn)品條目的總數(shù)而是特定訂購產(chǎn)品條目的數(shù)目。換句話說,你可以看到某一特定定單包括三種產(chǎn)品,但卻并不能表示客戶各訂購了5種。你得到的正是按照定單統(tǒng)計的產(chǎn)品總量。你應(yīng)該用GROUP BY字句來查看訂購產(chǎn)品的總數(shù)。
使用GROUP BY
使用GROUP BY就好比提出下面的問題:“我如何查看數(shù)據(jù)?“如果答案是“按照”某種要素來看那么你就可能用到GROUP BY。就我們的例子來說,你希望按照定單查看產(chǎn)品的數(shù)量,所以你就可以用OrderID字段進行分組。此外,采用ORDER BY 子句可以更容易地找出訂購條目最多的定單。新的查詢語句如下所示:
SELECT o.OrderID, Count(od.ProductID) as NumItemsFROM Orders o, [Order Details] od
WHERE o.OrderID = od.OrderID
GROUP BY o.OrderID
ORDER BY NumItems DESC
現(xiàn)在你就得到問題的答案了。如圖B所示的部分結(jié)果,定單號11077訂購了25種產(chǎn)品,而排第2的最大定單則只訂購了6類產(chǎn)品。
理解規(guī)則
GROUP BY具有相當(dāng)高的靈活性,當(dāng)然你還得遵守相應(yīng)的語法規(guī)則。比如說,你可以在ORDER BY 子句中包含多個表列。如果你想查看每一客戶訂購產(chǎn)品各個類型的數(shù)量,那么你必須通過定單創(chuàng)建查詢把客戶連接到產(chǎn)品。圖A顯示的4表連接顯然就要用到了。之 后你要根據(jù)客戶和產(chǎn)品進行分組同時對Order Details表內(nèi)的Quantity列計算總和。查詢語句如下:
SELECT c.CompanyName, p.ProductName, Sum(od.Quantity) as TotalBoughtFROM Customers c, Products p, Orders o, [Order Details] od
WHERE
c.CustomerID=o.CustomerID AND
o.OrderID=od.OrderID AND
od.ProductID=p.ProductID
GROUP BY c.CompanyName, p.ProductName
ORDER BY CompanyName, TotalBought DESC
查詢結(jié)果顯示出數(shù)據(jù)庫內(nèi)每一客戶購買各類產(chǎn)品的總數(shù)。
同時,你還可以在查詢中置入多個匯集列。例如,假設(shè)你想查看的定單列表要顯示單一項目的最大購買量以及該定單的項目總數(shù),那么以下的語句就可以用Max函數(shù)來顯示單一項目的最大訂購量。這種方法還能對所購項目總量求和。
SELECT o.OrderID,Max(od.Quantity) as TopItem,
Sum(od.Quantity) as TotalBought
FROM
Orders o,
[Order Details] od,
Products p
WHERE
o.OrderID = od.OrderID AND
od.ProductID=p.ProductID
GROUP BY o.OrderID
ORDER BY TotalBought DESC
現(xiàn)在你得到了定單、訂購量排前列的數(shù)量以及定單總項。
GROUP BY是過濾數(shù)據(jù)的一種強有力的工具。為了在你的SQL表內(nèi)計算數(shù)據(jù),它的功能不可小看。
關(guān)鍵字:SQL Server、數(shù)據(jù)庫
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動項
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機IP講解
- CentOS7使用hostapd實現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯
- 解決Centos7雙系統(tǒng)后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認iptable規(guī)則詳解