2017-01-30 4 views
0

現在、GROUP BY WITH ROLLUPを使用して合計行を作成しているクエリを修正する作業が行われています。合計グループ化行にラベルを付ける

SELECT CONVERT(date, ShipDate), 
     DelNum, 
     SUM(ShipQty), 
     ROW_NUMBER() OVER(ORDER BY CASE WHEN ShipDate IS NULL THEN 0 ELSE ShipDate END ASC,CASE WHEN DelNum IS NULL THEN 'Z' ELSE DelNum END ASC) 
FROM Shipments 
WHERE Company = 'ABC' AND CustNum = 3 
GROUP BY ShipDate, DelNum, ShipQty WITH ROLLUP 

これは私が与えられたクエリでした。私はいくつかのラベルといくつかの注文を読みやすくするために追加しています。

SELECT CONVERT(date, ShipDate), 
     CASE WHEN (GROUPING(DelNum) = 1) THEN 'SUB TOTAL FOR ' + CONVERT(NVARCHAR, ShipDate, 111) 
      WHEN (GROUPING(ShipQty) = 1) THEN 'SUB TOTAL FOR ' + DelNum 
      --WHEN (GROUPING(Total) = 1) THEN 'TOTAL' 
      ELSE ISNULL(DelNum, 'UNKNOWN') 
     END AS DelNum, 
     SUM(ShipQty) Total, 
     ROW_NUMBER() OVER(ORDER BY CASE WHEN ShipDate IS NULL THEN 0 ELSE ShipDate END ASC,CASE WHEN DelNum IS NULL THEN 'Z' ELSE DelNum END ASC) 
FROM Shipments 
WHERE Company = 'ABC' AND CustNum = 3 
GROUP BY ShipDate, DelNum, ShipQty WITH ROLLUP 
ORDER BY ShipDate, DelNum, Total ASC 

私がコメントした行は問題があります。どのように総行にラベルを付けることができますか。私はTotalを認識不能にしています。

ご協力いただければ幸いです。

答えて

1

Totalは列エイリアスであり、GROUPING関数で参照することはできません。また、このようなGROUPING機能で集計を置くことはできません。

あなたが すべてのグループフィールドが GROUPING() = 1持っていることを確認されて何ができるか
WHEN (GROUPING(SUM(ShipQty)) = 1) 

CASE WHEN (GROUPING(ShipDate) = 1 and GROUPING(DelNum) = 1 and GROUPING(ShipQty) = 1) THEN 'TOTAL' 
      WHEN (GROUPING(DelNum) = 1) THEN 'SUB TOTAL FOR ' + CONVERT(NVARCHAR, ShipDate, 111) 
      WHEN (GROUPING(ShipQty) = 1) THEN 'SUB TOTAL FOR ' + DelNum   
      ELSE ISNULL(DelNum, 'UNKNOWN') 
     END AS DelNum 

注意必要にそのチェックをCASEの先頭に移動するか、CASEが評価される前に短絡されます(各個人GROUPINGはそれ自身1であるため)。

+0

ありがとうございました。 –

関連する問題