探討SQL Server 2005的評價函數(2)_Mssql數據庫教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
推薦:SQL SERVER中易混淆的數據類型數據類弄是數據的一種屬性,表示數據所表示信息的類型。任何一種計算機語言都定義了自己的數據類型。當然,不同的程序語言都具有不同的特點,所定義的數據類型的各類和名稱都或多或少有些不同。
| ProductID | Name | Price | PriceRank |
| 8 | Desk | 495.0000 | 1 |
| 10 | Executive Chair | 295.0000 | 2 |
| 9 | Chair | 125.0000 | 3 |
| 5 | Mouse | 14.9500 | 4 |
| 6 | Mousepad | 9.9900 | 5 |
| 11 | Scissors | 8.5000 | 6 |
| 4 | Stapler | 7.9500 | 7 |
| 3 | Binder | 1.9500 | 8 |
| ... | |||
默認情況下,這個ROW_NUMBER函數把一個增量值(逐次加1)賦給結果集中的每一個記錄。借助于可選的partition參數,無論何時分區(partitioning)列值發生變化,你都可以讓ROW_NUMBER函數重新計算行數。為了說明這個問題,我使用如下查詢語法創建了一個視圖vwTotalAmountBilledPerOrder,它將返回每一個OrderID和該訂購的總訂單數:
| SELECT OrderID,SUM(AmountBilled) AS TotalOrderAmountFROM OrderItemsGROUP BY OrderID |
這條語句將返回OrderItems表中每一個唯一的訂單,還有相應于該訂單的AmountBilled值的和。借助于這個視圖,我們可以使用ROW_NUMBER方法來按最大花錢數來評價這些訂單,如下所示:
| SELECT c.Name,o.DateOrdered,tab.TotalOrderAmount, ROW_NUMBER() OVER (ORDER BY TotalOrderAmount DESC) AS BestCustomerFROM vwTotalAmountBilledPerOrder AS tab INNER JOIN Orders AS o ON o.OrderID = tab.OrderID INNER JOIN Customers AS c ON c.CustomerID = o.CustomerID |
這個語句將返回如下表所示的結果:
| Name | DateOrdered | TotalOrderAmount | BestCustomer |
| Bob | 12/1/2005 | 12649.9900 | 1 |
| Darren | 1/2/2006 | 620.0000 | 2 |
| Bob | 12/19/2005 | 265.8500 | 3 |
| Tito | 12/22/2005 | 14.9500 | 4 |
| Bruce | 1/5/2006 | 14.9500 | 5 |
| Tito | 12/18/2005 | 12.4400 | 6 |
| Bruce | 1/4/2006 | 9.9900 | 7 |
| Lee Ann | 1/3/2006 | 8.5000 | 8 |
| ... | |||
注意,某些顧客多次出現在這個列表中(如Bob,Tito和Bruce)。也許有時,我們不是想觀看以銷售量排序的所有訂單,而更想看到每一個顧客的最高訂單量。為此,我們可以通過使用ROW_NUMBER函數中的PARTITION BY子句達到這一目的,如下所示:
| SELECT c.Name, o.DateOrdered, tab.TotalOrderAmount, ROW_NUMBER() OVER (PARTITION BY c.CustomerID ORDER BY TotalOrderAmount DESC) AS BestCustomerFROM vwTotalAmountBilledPerOrder AS tab INNER JOIN Orders AS o ON o.OrderID = tab.OrderID INNER JOIN Customers AS c ON c.CustomerID = o.CustomerID |
這個語句將返回如下表所示的結果:
| Name | DateOrdered | TotalOrderAmount | BestCustomer |
| Bob | 12/1/2005 | 12649.9900 | 1 |
| Bob | 12/19/2005 | 265.8500 | 2 |
| Tito | 12/22/2005 | 14.9500 | 1 |
| Tito | 12/18/2005 | 12.4400 | 2 |
| Darren | 1/2/2006 | 620.0000 | 1 |
| Bruce | 1/5/2006 | 14.9500 | 1 |
| Bruce | 1/4/2006 | 9.9900 | 2 |
| Lee Ann | 1/3/2006 | 8.5000 | 1 |
| ... | |||
注意,盡管這些結果非常不錯;但是,你卻不能在WHERE語句中使用ROW_NUMBER()函數(或任何其它的評價函數)。也就是說,你可能想要說,"把按價格評價第5到第8名的產品列出"。為此,你需要使用一個派生的表或視圖。例如,你可以把上面的查詢放到一個視圖vwPriceRankedProducts中,然后使用如下查詢返回第5到第8個排名的產品:
| SELECT ProductID,Name,Price,PriceRankFROM vwPriceRankedProductsWHERE PriceRank BETWEEN 5 AND 8 |
四、 使用RANK和DENSE_RANK處理同級問題
基于可選的partition子句和要求的order by子句,ROW_NUMBER函數默認地遞增(加1)每一個返回結果的值。然而,有時你可能想以不同方式處理相同級別,而不是把相同的值賦給相同的級別。例如,前面顯示的總訂單列表中,Tito在2005年12月22日實現的訂單數與Bruce在2006年1月5日實現的訂單數相同;然而,ROW_NUMBER函數卻把這兩行評價為#4和#5,而不是都評價為#4。
分享:SQL Server 中易混淆的數據類型近來在做數據庫設計,有時候真弄不清SQL2000里的數據類型,所以摘了這篇文章。 摘自“藍色理想”。 (1)char、varchar、text和nchar、nvarchar、ntext char和varchar的長
相關Mssql數據庫教程:
- sql 語句練習與答案
- 深入C++ string.find()函數的用法總結
- SQL Server中刪除重復數據的幾個方法
- sql刪除重復數據的詳細方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數據庫,提示 無法為該請求檢索數據 錯誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數的用法實例詳解
- 相關鏈接:
- 教程說明:
Mssql數據庫教程-探討SQL Server 2005的評價函數(2)
。