2011-08-13 21 views
56

私の割り当てでは、「日付ごとに何通の請求書が書かれていますか?CUBEとROLLUPの違いを理解する

私はちょっと立ち止まり、私の教授に助けを求めました。彼女は私に、「各タイプとバージョンのどれくらいのストーブが建設されたか」という質問に答えるための質問をメールで送った。 チャレンジはしても余分な点はないが、ストーブの総数を含める。

これは、彼女が私を送ったクエリだった:それは私のニーズを満たしてまでそう

SELECT STOVE.Type + STOVE.Version AS 'Type+Version' 
, COUNT(*) AS 'The Count' 
FROM STOVE 
GROUP BY STOVE.Type + STOVE.Version WITH ROLLUP; 

、私はそのクエリを微調整しました。これは私が思いついたものです:

SELECT InvoiceDt 
, COUNT(InvoiceNbr) AS 'Number of Invoices' 
FROM INVOICE 
GROUP BY InvoiceDt WITH ROLLUP 
ORDER BY InvoiceDt ASC; 

そして、私が望む次の結果を返しました。

とにかく、私はROLLUP句を読んで、Microsoftの記事から始めました。これはROLLUP句は、CUBE句に類似していたと述べたが、それは以下のようにCUBE句と区別していること:

  1. CUBEは、選択された列の値のすべての組み合わせのための凝集体を示す結果セットを生成します。
  2. ROLLUPは、選択した列の値の階層の集計を示す結果セットを生成します。

そこで、私は自分のクエリのROLLUPをCUBEと置き換えて、どうなるかを確認することにしました。彼らは同じ結果を生み出しました。私はそれが私が混乱しているところだと思います。

私がここにいるクエリのタイプを使用している場合、2つの句の間に実際的な違いはないようです。そうですか?それとも、私は何かを理解していないのですか? Microsoftの記事を読み終えたら、私の結果はCUBE節を使って異なるはずだったと思っていました。

答えて

130

1つの列だけをロールアップしているので、違いはありません。我々はROLLUP

ROLLUP (YEAR, MONTH, DAY)

を行う例を考えてみましょう、それは以下の出力があります:CUBE

YEAR, MONTH, DAY 
YEAR, MONTH 
YEAR 
() 

を、それは次のようになります:

YEAR, MONTH, DAY 
YEAR, MONTH 
YEAR, DAY 
YEAR 
MONTH, DAY 
MONTH 
DAY 
() 

CUBE基本的に各ノードのロールアップシナリオをすべて含みますが、ROLLUPは階層をそのまま維持します(したがって、MONTHをスキップしてYEAR/DAYを表示するのではなく、CUBEを表示します)

これは、あなたがたった一つの列しか持っていなかったので。

希望に役立ちます。

+1

興味深いを取得するにはいくつかの方法でALL GROUP BY + UNIONを展開します。私はデザイナーがなぜそれを選んで、それがどのように振る舞うかのために特別な属性のパラメータを追加したのではないかと思います。基本的に同じことをするが、わずかに異なるものには明確な名前を付けるのはかなりばかげている。 – user2326106

6

これは、グループ化する列が1つしかないためです。

Group by InvoiceDt, InvoiceCountryを追加(または任意のフィールドはより多くのデータを提供します。

がキューブに

は、各InvoiceDtのためにあなたの合計を与えると、あなたは、各InvoiceCountryのための合計を取得します。

62

を私たちは違いを理解することができますROLLUPとCUBEを簡単な例で示します。学生の四半期テストの結果を含む表があるとします。四半期と学生に対応する合計を表示する必要があります。

SELECT * INTO #TEMP 
FROM 
(
    SELECT 'Quarter 1' PERIOD,'Amar' NAME ,97 MARKS 
    UNION ALL 
    SELECT 'Quarter 1','Ram',88 
    UNION ALL 
    SELECT 'Quarter 1','Simi',76 
    UNION ALL 
    SELECT 'Quarter 2','Amar',94 
    UNION ALL 
    SELECT 'Quarter 2','Ram',82 
    UNION ALL 
    SELECT 'Quarter 2','Simi',71 
    UNION ALL 
    SELECT 'Quarter 3' ,'Amar',95 
    UNION ALL 
    SELECT 'Quarter 3','Ram',83 
    UNION ALL 
    SELECT 'Quarter 3','Simi',77 
    UNION ALL 
    SELECT 'Quarter 4' ,'Amar',91 
    UNION ALL 
    SELECT 'Quarter 4','Ram',84 
    UNION ALL 
    SELECT 'Quarter 4','Simi',79 
)TAB 

enter image description here

1. ROLLUP(1列に対応するため、合計を見つけることができます)

(a)すべての四半期では、各学生の合計スコアを取得します。

SELECT * FROM #TEMP 
UNION ALL 
SELECT PERIOD,NAME,SUM(MARKS) TOTAL 
FROM #TEMP 
GROUP BY NAME,PERIOD 
WITH ROLLUP 
HAVING PERIOD IS NULL AND NAME IS NOT NULL 
// Having is used inorder to emit a row that is the total of all totals of each student 

には、以下の結果である(a)の

enter image description here

(b)は、あなたがの結果が続き、各四半期

SELECT * FROM #TEMP 
UNION ALL 
SELECT PERIOD,NAME,SUM(MARKS) TOTAL 
FROM #TEMP 
GROUP BY PERIOD,NAME 
WITH ROLLUP 
HAVING PERIOD IS NOT NULL AND NAME IS NULL 

の合計スコアを取得する必要がありINCASE( b)

enter image description here

2. CUBE

SELECT PERIOD,NAME,SUM(MARKS) TOTAL 
FROM #TEMP 
GROUP BY NAME,PERIOD 
WITH CUBE 
HAVING PERIOD IS NOT NULL OR NAME IS NOT NULL 

後はCUBE

enter image description here

今、あなたは疑問を抱いすることができるの結果である(シングルショットで四半期の合計だけでなく、学生を見つけます。) ROLLUPとCUBEのリアルタイム使用。時には、1回のショットで各四半期の合計と各学生の合計を表示する必要があるレポートが必要な場合もあります。ここに例があります

上記のCUBEクエリを少し変更していますが、両方の合計が必要です。

SELECT CASE WHEN PERIOD IS NULL THEN 'TOTAL' ELSE PERIOD END PERIOD, 
CASE WHEN NAME IS NULL THEN 'TOTAL' ELSE NAME END NAME, 
SUM(MARKS) MARKS 
INTO #TEMP2 
FROM #TEMP 
GROUP BY NAME,PERIOD 
WITH CUBE 

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + PERIOD + ']', 
       '[' + PERIOD + ']') 
       FROM (SELECT DISTINCT PERIOD FROM #TEMP2) PV 
       ORDER BY PERIOD  


DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT * FROM #TEMP2 
      ) x 
      PIVOT 
      (
       SUM(MARKS) 
       FOR [PERIOD] IN (' + @cols + ') 
      ) p;' 

EXEC SP_EXECUTESQL @query 

今、あなたはあなたがSET、CUBE、ROLLのUPをグループ化についての詳細を見つけることができ、以下の結果

enter image description here

関連する問題