SQLServerデータベースのデータ要約完全解析(WITH ROLLUP)

3135 ワード

既存の表A、内容は以下の通りです.
       
      01   A    6
      01   B    7
      02   A    8
      02   B    9

このフォーマットをエンコードでクエリーしたい場合は、次のようにします.
01   A    6
      01   B    7
       :   13
      02   A    8
      02   B    9
       :   17

問:どのように実現すればいいですか.
一見、簡単そうですが、group byで実現できそう?しかし、よく研究すると、groupbyもどうしようもないと思って、いつも欠点があって、手がつけられません.では、どうすればいいのでしょうか.焦らないで、SQL Serverはとっくに私たちを手伝ってくれました.次は、私と一緒に来てください.
まず、次の言葉を見てみましょう.
小計と合計を含むレポートを生成する場合、ROLLUP演算子は便利です.ROLLUP演算子によって生成される結果セットは、CUBE演算子によって生成される結果セットと類似しています.
CUBE演算子によって生成される結果セットは多次元データセットです.多次元データセットは事実データの拡張であり、事実データは個別イベントのデータを記録する.拡張は、ユーザーが分析しようとするカラムに確立されます.これらの列は次元と呼ばれます.多次元データセットは、各次元のすべての可能な組合せのクロステーブルを含む結果セットです.
CUBE演算子はSELECT文のGROUP BY句で指定します.この文の選択リストには、次元列と集約関数式が含まれます.GROUP BYは、次元列とキーワードWITH CUBEを指定します.結果セットには、次元列の各値の可能なすべての組合せと、これらの次元値の組合せと一致するベースラインの集約値が含まれます.
CUBEとROLLUPの違いは、
CUBEによって生成された結果セットには、選択した列の値のすべての組合せの集約が表示されます.
ROLLUPで生成された結果セットには、選択したカラムの値の階層の集約が表示されます.
以上の話を読んで、何か悟ったことはありませんか.もしないならば、それでは…へへへへ、あなたの悟りはまだ足りないで、离れて“三花�岸の粉はとても爱しい人にたたきつけられます.次に私达は更に1段见ます(注意して、答えはすぐに明らかになりました):
SELECT  ,  , Sum( ) as  
      FROM A
      GROUP BY  ,   WITH ROLLUP

--鍵は後ろのWITH ROLLUP
--もちろん、WITH CUBEも使えますが、結果はちょっと違います
上の部分を見ても「雲の中に霧が立ち込めている」と思っているかもしれませんが、頭がつかめません.どうしてもわからなくてもいいので、自分でやります.
まず、上記のA表を作成し、数行のデータを入力します.
次に、SQL Serverクエリーアナライザを開き、上に作成したAテーブルを含むサーバに接続し、テーブルを含むデータベースを選択します.
それから:Copyの上のSQL文、Pasteはクエリーアナライザに行って、F 5を押して、どうですか.下に何が出てきたか見えますか?私の下と同じではないでしょうか.
           
      01      A      6
      01      B      7
      01     NULL     13
      02      A      8
      02      B      9
      02     NULL     17
      NULL    NULL     30

--WITH CUBEを使用している場合は、結果セットの後に2つ追加されます(例の数行のデータを入力するだけであれば):
NULL     A     14
      NULL     B     16

あれ!不思議なことに、結果の中でどうしてそんなに多くの“NULL”の値がありますか?ああ、焦らないでください.この数行はまさに私たちが望んでいる要約データ行です.
01 NULL 13は、01として符号化されたすべての倉庫の数の要約である.02 NULL 17は、02として符号化されたすべての倉庫の数の要約である.
NULL NULL 30は、全てのデータライン数の要約である.
どうですか.答えは出たでしょう?簡単ではないでしょうか.もちろん、上には少し欠点があります.それは「NULL」がたくさんあることです.これらの無意味なNULLをどのように削除しますか?次に最適化を行います.
1、NULL値をGroupingで置き換える
SELECT CASE WHEN (GROUPING( ) = 1) THEN 'ALL'
      ELSE ISNULL( , 'UNKNOWN')
      END AS  ,
      CASE WHEN (GROUPING( ) = 1) THEN 'ALL'
      ELSE ISNULL( , 'UNKNOWN')
      END AS  ,
      SUM( ) AS  
      FROM A
      GROUP BY  ,   WITH ROLLUP

--Case関数の適切な運用
結局私はここで書かないで、上の“NULL”の値をすべて“ALL”の文字列に変えます
2、プログラムを利用して更なる最適化を行う
//通常、表示上の必要性のために、上記のSQL文で生成された結果を最適化する必要があります.次に、自然言語の説明を示します.
WHILE( ){
        IF  ALL ALL
        {
            “ :” , "" ;
            ;
        }
        ELSE  ALL ALL
        {
            “ :” , "" ;
            ;
        }
         ;
      }