日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

探討SQL Server 2005的評(píng)價(jià)函數(shù)(2)_Mssql數(shù)據(jù)庫(kù)教程

編輯Tag賺U幣
教程Tag:暫無(wú)Tag,歡迎添加,賺取U幣!

推薦:SQL SERVER中易混淆的數(shù)據(jù)類型
數(shù)據(jù)類弄是數(shù)據(jù)的一種屬性,表示數(shù)據(jù)所表示信息的類型。任何一種計(jì)算機(jī)語(yǔ)言都定義了自己的數(shù)據(jù)類型。當(dāng)然,不同的程序語(yǔ)言都具有不同的特點(diǎn),所定義的數(shù)據(jù)類型的各類和名稱都或多或少有些不同。


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
...

  默認(rèn)情況下,這個(gè)ROW_NUMBER函數(shù)把一個(gè)增量值(逐次加1)賦給結(jié)果集中的每一個(gè)記錄。借助于可選的partition參數(shù),無(wú)論何時(shí)分區(qū)(partitioning)列值發(fā)生變化,你都可以讓ROW_NUMBER函數(shù)重新計(jì)算行數(shù)。為了說(shuō)明這個(gè)問(wèn)題,我使用如下查詢語(yǔ)法創(chuàng)建了一個(gè)視圖vwTotalAmountBilledPerOrder,它將返回每一個(gè)OrderID和該訂購(gòu)的總訂單數(shù):

SELECT OrderID,SUM(AmountBilled) AS TotalOrderAmountFROM OrderItemsGROUP BY OrderID

  這條語(yǔ)句將返回OrderItems表中每一個(gè)唯一的訂單,還有相應(yīng)于該訂單的AmountBilled值的和。借助于這個(gè)視圖,我們可以使用ROW_NUMBER方法來(lái)按最大花錢(qián)數(shù)來(lái)評(píng)價(jià)這些訂單,如下所示:

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

  這個(gè)語(yǔ)句將返回如下表所示的結(jié)果:

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
...

  注意,某些顧客多次出現(xiàn)在這個(gè)列表中(如Bob,Tito和Bruce)。也許有時(shí),我們不是想觀看以銷售量排序的所有訂單,而更想看到每一個(gè)顧客的最高訂單量。為此,我們可以通過(guò)使用ROW_NUMBER函數(shù)中的PARTITION BY子句達(dá)到這一目的,如下所示:

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

  這個(gè)語(yǔ)句將返回如下表所示的結(jié)果:

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
...

  注意,盡管這些結(jié)果非常不錯(cuò);但是,你卻不能在WHERE語(yǔ)句中使用ROW_NUMBER()函數(shù)(或任何其它的評(píng)價(jià)函數(shù))。也就是說(shuō),你可能想要說(shuō),"把按價(jià)格評(píng)價(jià)第5到第8名的產(chǎn)品列出"。為此,你需要使用一個(gè)派生的表或視圖。例如,你可以把上面的查詢放到一個(gè)視圖vwPriceRankedProducts中,然后使用如下查詢返回第5到第8個(gè)排名的產(chǎn)品:

SELECT ProductID,Name,Price,PriceRankFROM vwPriceRankedProductsWHERE PriceRank BETWEEN 5 AND 8

  四、 使用RANK和DENSE_RANK處理同級(jí)問(wèn)題

  基于可選的partition子句和要求的order by子句,ROW_NUMBER函數(shù)默認(rèn)地遞增(加1)每一個(gè)返回結(jié)果的值。然而,有時(shí)你可能想以不同方式處理相同級(jí)別,而不是把相同的值賦給相同的級(jí)別。例如,前面顯示的總訂單列表中,Tito在2005年12月22日實(shí)現(xiàn)的訂單數(shù)與Bruce在2006年1月5日實(shí)現(xiàn)的訂單數(shù)相同;然而,ROW_NUMBER函數(shù)卻把這兩行評(píng)價(jià)為#4和#5,而不是都評(píng)價(jià)為#4。

分享:SQL Server 中易混淆的數(shù)據(jù)類型
近來(lái)在做數(shù)據(jù)庫(kù)設(shè)計(jì),有時(shí)候真弄不清SQL2000里的數(shù)據(jù)類型,所以摘了這篇文章。 摘自“藍(lán)色理想”。   (1)char、varchar、text和nchar、nvarchar、ntext char和varchar的長(zhǎng)

來(lái)源:模板無(wú)憂//所屬分類:Mssql數(shù)據(jù)庫(kù)教程/更新時(shí)間:2008-08-22
相關(guān)Mssql數(shù)據(jù)庫(kù)教程