2012-04-03 6 views
0

私のデータセットの中で最も高いバスケットを計算したいと思っていますが、どうやってやるべきか私の頭を上げることはできません。それはかなり厄介と思われる場合はSQLは最大の行の合計を返します

OrderID | CustomerID | BasketID | ProductID | Price 

1 | 1 | 1 | 221 | 10 
2 | 1 | 1 | 431 | 123 
3 | 1 | 2 | 761 | 44 
4 | 2 | 3 | 12 | 54 
5 | 2 | 3 | 102 | 78 
6 | 3 | 4 | 111 | 98 
7 | 3 | 4 | 41 | 45 
8 | 3 | 5 | 65 | 66 
9 | 4 | 6 | 32 | 47 
10 | 4 | 6 | 118 | 544 

申し訳ありません:

は、私のようなデータを持っています。

しかし

おかげであなたが使用することができます

+2

** **データベースシステムとバージョンは何ですか? ** SQL **は多くのデータベースシステムで使用されている言語である構造化問合せ言語です - SQLはデータベース製品ではありません**このようなものはベンダー固有のものです。 ... –

+0

私はSQL Server 2008 R2を使用しています。ごめんなさい。質問に入れるのを忘れてしまったのでしょうか。 –

答えて

0
SELECT * 
FROM (SELECT *, 
       DENSE_RANK() OVER (PARTITION BY CustomerID ORDER BY BasketTotal DESC) AS RNK 
     FROM (SELECT Sum(Price) AS BasketTotal, 
         BasketID, 
         CustomerID 
       FROM Order a 
       GROUP BY BasketID, 
          CustomerID 
         ) a 

     ) b 
     WHERE RNK = 1 

私はそれがうまくいくかどうかを思いついた。

1

を私は簡単に明らか

SELECT SUM([Price]), BasketID, CustomerID FROM table 
GROUP BY BasketID, CustomerID 

でSUMを得ることができますしかし、どのように私はその得意先のための唯一の最高価格のバスケットIDのリストをフィルタリングすることができますROW_NUMBER機能を持つCTE(Common Table Expression):

;WITH HighestPricePerCustomerAndBasket AS 
(
    SELECT 
     ID, UserID, ClassID, SchoolID, Created, 
     ROW_NUMBER() OVER(PARTITION BY BasketID,CustomerID ORDER BY Price DESC) AS 'RowNum' 
    FROM dbo.YourTable 
) 
SELECT 
    [Price], BasketID, CustomerID 
FROM HighestPricePerCustomerAndBasket 
WHERE RowNum = 1 

このCTEはデータをBasketID,CustomerIDで「分割」し、パーティションごとにROW_NUMBER関数は1から始まり、Price DESCで順序付けされた連続番号を手渡すので、最初の行(最高価格)はRowNum = 1(各BasketID,CustomerID "パーティション")になります。それは後にSELECTステートメントでCTEから選択するものです。

+0

申し訳ありませんが、うまくいきませんでした。 –

関連する問題