2012-05-03 17 views
0

たとえば、Purchaseという2つの列を持つSQL Server 2008 R2のテーブルがあるとします:PurchaserExpenditureです。ロールアップしたグループでソートするにはどうすればよいですか?

のは、テーブルには、次の行を持っているとしましょう:

Purchaser Expenditure 
--------- ----------- 
Alex   200 
Alex   300 
Alex   500 
Bob   300 
Bob   400 
Charlie  200 
Charlie  600 
Derek  100 
Derek  300 

は今、私はこのクエリを持っている:

SELECT Purchaser, Expenditure, SUM(Expenditure) AS SumExpenditure FROM Purchase GROUP BY Purchaser, Expenditure WITH ROLLUP

これには次の値を返します。

Purchaser Expenditure SumExpenditure 
--------- ----------- -------------- 
Alex   200   200 
Alex   300   300 
Alex   500   500 
-------------------------------- 
Alex   NULL   1000 
-------------------------------- 
Bob   300   300 
Bob   400   400 
-------------------------------- 
Bob   NULL   700 
-------------------------------- 
Charlie  200   200 
Charlie  600   600 
-------------------------------- 
Charlie  NULL   800 
-------------------------------- 
Derek  100   100 
Derek  300   300 
-------------------------------- 
Derek  NULL   400 
-------------------------------- 

(ラインロールアップした金額を強調するために追加されました)

私が望むことは、私はこのように設定された結果で終わるようにグループ化された金額でグループを並べ替えることができるように、次のようになります。つまり

Purchaser Expenditure SumExpenditure 
--------- ----------- -------------- 
Derek  100   100 
Derek  300   300 
-------------------------------- 
Derek  NULL   400 
-------------------------------- 
Bob   300   300 
Bob   400   400 
-------------------------------- 
Bob   NULL   700 
-------------------------------- 
Charlie  200   200 
Charlie  600   600 
-------------------------------- 
Charlie  NULL   800 
-------------------------------- 
Alex   200   200 
Alex   300   300 
Alex   500   500 
-------------------------------- 
Alex   NULL   1000 
-------------------------------- 

、私は、グループの並べ替え使用していますグループ行の400,700,800および1000を昇順に並べ替えます。

誰でもどのようなクエリがこの結果セットを返すかを提案できますか?

答えて

0
;WITH x AS 
(
    SELECT Purchaser, Expenditure, s = SUM(Expenditure) 
    FROM dbo.Purchase 
    GROUP BY Purchaser, Expenditure WITH ROLLUP 
), 
y AS 
(
    SELECT Purchaser, s FROM x 
    WHERE Expenditure IS NULL 
    AND Purchaser IS NOT NULL 
), 
z AS 
(
    SELECT Purchaser, s, rn = ROW_NUMBER() OVER (ORDER BY s) 
    FROM y 
) 
SELECT x.Purchaser, x.Expenditure, x.s FROM x 
INNER JOIN z ON x.Purchaser = z.Purchaser 
ORDER BY z.rn, CASE WHEN z.s IS NULL THEN 2 ELSE 1 END; 
関連する問題