SQLServerデータベースのデータ要約完全解析(WITH ROLLUP)
3135 ワード
既存の表A、内容は以下の通りです.
このフォーマットをエンコードでクエリーしたい場合は、次のようにします.
問:どのように実現すればいいですか.
一見、簡単そうですが、group byで実現できそう?しかし、よく研究すると、groupbyもどうしようもないと思って、いつも欠点があって、手がつけられません.では、どうすればいいのでしょうか.焦らないで、SQL Serverはとっくに私たちを手伝ってくれました.次は、私と一緒に来てください.
まず、次の言葉を見てみましょう.
小計と合計を含むレポートを生成する場合、ROLLUP演算子は便利です.ROLLUP演算子によって生成される結果セットは、CUBE演算子によって生成される結果セットと類似しています.
CUBE演算子によって生成される結果セットは多次元データセットです.多次元データセットは事実データの拡張であり、事実データは個別イベントのデータを記録する.拡張は、ユーザーが分析しようとするカラムに確立されます.これらの列は次元と呼ばれます.多次元データセットは、各次元のすべての可能な組合せのクロステーブルを含む結果セットです.
CUBE演算子はSELECT文のGROUP BY句で指定します.この文の選択リストには、次元列と集約関数式が含まれます.GROUP BYは、次元列とキーワードWITH CUBEを指定します.結果セットには、次元列の各値の可能なすべての組合せと、これらの次元値の組合せと一致するベースラインの集約値が含まれます.
CUBEとROLLUPの違いは、
CUBEによって生成された結果セットには、選択した列の値のすべての組合せの集約が表示されます.
ROLLUPで生成された結果セットには、選択したカラムの値の階層の集約が表示されます.
以上の話を読んで、何か悟ったことはありませんか.もしないならば、それでは…へへへへ、あなたの悟りはまだ足りないで、离れて“三花�岸の粉はとても爱しい人にたたきつけられます.次に私达は更に1段见ます(注意して、答えはすぐに明らかになりました):
--鍵は後ろのWITH ROLLUP
--もちろん、WITH CUBEも使えますが、結果はちょっと違います
上の部分を見ても「雲の中に霧が立ち込めている」と思っているかもしれませんが、頭がつかめません.どうしてもわからなくてもいいので、自分でやります.
まず、上記のA表を作成し、数行のデータを入力します.
次に、SQL Serverクエリーアナライザを開き、上に作成したAテーブルを含むサーバに接続し、テーブルを含むデータベースを選択します.
それから:Copyの上のSQL文、Pasteはクエリーアナライザに行って、F 5を押して、どうですか.下に何が出てきたか見えますか?私の下と同じではないでしょうか.
--WITH CUBEを使用している場合は、結果セットの後に2つ追加されます(例の数行のデータを入力するだけであれば):
あれ!不思議なことに、結果の中でどうしてそんなに多くの“NULL”の値がありますか?ああ、焦らないでください.この数行はまさに私たちが望んでいる要約データ行です.
01 NULL 13は、01として符号化されたすべての倉庫の数の要約である.02 NULL 17は、02として符号化されたすべての倉庫の数の要約である.
NULL NULL 30は、全てのデータライン数の要約である.
どうですか.答えは出たでしょう?簡単ではないでしょうか.もちろん、上には少し欠点があります.それは「NULL」がたくさんあることです.これらの無意味なNULLをどのように削除しますか?次に最適化を行います.
1、NULL値をGroupingで置き換える
--Case関数の適切な運用
結局私はここで書かないで、上の“NULL”の値をすべて“ALL”の文字列に変えます
2、プログラムを利用して更なる最適化を行う
//通常、表示上の必要性のために、上記のSQL文で生成された結果を最適化する必要があります.次に、自然言語の説明を示します.
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
{
“ :” , "" ;
;
}
;
}