[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.100 SQL文で構造が同じ複数テーブルを集計してみた

SQL文で構造が同じ複数テーブルを集計してみた



本文(発行内容)


こんにちは、三流プログラマーのKen3です。

今回は、
構造が同一の複数のテーブルから、
UNIONでデータをつなげ、
集計をしてみました。

いつもの三流的なアプローチなので、実際はアレンジして使ってください。

/* * 1.今回のキッカケ */

>(質問) 同じ構造(フィルード名)のテーブルがいくつかあります。 >この同じ条件でそれぞれ抽出してひとつに集計をさせたいのですが...。 >一番簡単なSQL文を教えて下さい。 >(例) テーブル  T_2002年売上  T_2003年売上  T_2004年売上 >    フィールド名 商品CD 売上金額 >(結果)  商品CD別に2002年から2004年の売上金額の合計を知りたい と、質問をもらった。 一番簡単なSQL文かぁ・・・なんだろうね。 よくあるパターンでテーブル構造が一緒ってことですよね。 いろいろなアプローチ方法ありそうだなぁ

/* * 2.Select * From T_2002年売上, T_2003年売上, T_2004年売上 */

さてと、まずは、複数テーブルからSelectしてみますか。 テーブルは T_2002年売上  T_2003年売上  T_2004年売上 の3つで、 フィールドは 商品CD 文字型 売上金額 数値型 で、テーブル作って、テストデータを放り込み、 T_2002年売上 商品CD 売上金額 A001 100 B002 50 A001 20 CCCC 1200 T_2003年売上 商品CD 売上金額 A001 100 CCCC 500 T_2004年売上 商品CD 売上金額 B002 250 DDDDD 5000 単純に複数テーブルをFromにセットしてみました Select * From T_2002年売上, T_2003年売上, T_2004年売上 なんてSQLを作り、走らせると、 http://www.ken3.org/cgi-bin/test/test100-1.asp ↑実行テスト 結果 T_2002年売上.商品CD T_2002年売上.売上金額 T_2003年売上.商品CD T_2003年売上.売上金額 T_2004年売上.商品CD T_2004年売上.売上金額 A001 100 A001 100 B002 250 A001 100 A001 100 DDDDD 5000 A001 100 CCCC 500 B002 250 A001 100 CCCC 500 DDDDD 5000 B002 50 A001 100 B002 250 B002 50 A001 100 DDDDD 5000 B002 50 CCCC 500 B002 250 B002 50 CCCC 500 DDDDD 5000 A001 20 A001 100 B002 250 A001 20 A001 100 DDDDD 5000 A001 20 CCCC 500 B002 250 A001 20 CCCC 500 DDDDD 5000 CCCC 1200 A001 100 B002 250 CCCC 1200 A001 100 DDDDD 5000 CCCC 1200 CCCC 500 B002 250 CCCC 1200 CCCC 500 DDDDD 5000 うわ・・ボロボロだね。これでは使えないや・・・

/* * 3.UNIONで構造が同じテーブルをつなげる */

オイオイ、テーブルつなげるのってUNIONじゃないの? まぁ、チョットやってみただけなので許してね。 あらためて、 Select * From T_2002年売上 UNION Select * From T_2003年売上 UNION Select * From T_2004年売上 とSQL文を作り、発行してみた。 http://www.ken3.org/cgi-bin/test/test100-2.asp ↑実行テスト 結果 商品CD 売上金額 A001 20 A001 100 B002 50 B002 250 CCCC 500 CCCC 1200 DDDDD 5000 よし、OKと思ったが、よく見ると、 A001 金額100って2002年と2003年にあるのに1つしかレコードが発生してない。 これは?なぜだ・・・ UNION だけだと 同じデータを親切に消してくれるんだぁ。 これはこれで、使えるかもしれないけど、集計したいんだよね今は。

/* * 4.UNION ALL でつなげる */

少し困っていたけど、UNION ALLなんて感じでつなげるとOKです。 ※ALL をつけると 同じデータは削除されません。 UNION ALL 演算子でつなげ、複数テーブルをSelectしてみました Select * From T_2002年売上 UNION ALL Select * From T_2003年売上 UNION ALL Select * From T_2004年売上 やっと縦に並んで取り出すことができたのかな? http://www.ken3.org/cgi-bin/test/test100-3.asp ↑テスト実行 実行結果 商品CD 売上金額 A001 100 B002 50 A001 20 CCCC 1200 A001 100 CCCC 500 B002 250 DDDDD 5000 やっと、 A001 100も出てきて、複数テーブルの明細をつなげて取り出せました。

/* * 5.SUM Group By したテーブルをUNIONでつなげる */

さてと、取り出したら次は集計ですよね。 集計は?SUMとGroup Byだよね、 Group By したテーブルをUNIONでつなげるかな。 単純に書くと、 SUM Group By したテーブルを UNION ALL 演算子でつなげ、複数テーブルをSelectしてみるんだから、 Select 商品CD, SUM(売上金額) AS 合計金額 From T_2002年売上 Group By 商品CD UNION ALL Select 商品CD, SUM(売上金額) AS 合計金額 From T_2003年売上 Group By 商品CD UNION ALL Select 商品CD, SUM(売上金額) AS 合計金額 From T_2004年売上 Group By 商品CD これを実行すると?どうなるのかな? http://www.ken3.org/cgi-bin/test/test100-4.asp ↑テスト実行 実行結果 商品CD 合計金額 A001 120 B002 50 CCCC 1200 A001 100 CCCC 500 B002 250 DDDDD 5000 ↑あらら、年度別に集計されちまったよ これは、これで、使えそうな場合もあるんだけど今回はダメだよね。

/* * 6.UNIONでつなげたテーブル(結果)をSUM Group Byする(集計する) */

だから、三流プログラマーはダメなんだって? SUM Group By したテーブルをUNIONでつなげる なんて思考じゃなくて、 UNIONでつなげたテーブル(結果)をSUM Group Byする(集計する) そんな感じでしょ? そっか、発想が、考え方の流れがSQLしてなかったのね。 データの集合を作ったら、それに対して処理かぁ。 Select 商品CD, SUM(売上金額) AS 合計金額 From ( Select 商品CD, 売上金額 From T_2002年売上 UNION ALL Select 商品CD, 売上金額 From T_2003年売上 UNION ALL Select 商品CD, 売上金額 From T_2004年売上 ) Group By 商品CD と、 ()の中がUNIONでつなげた明細です これをSUM,Group Byすると? http://www.ken3.org/cgi-bin/test/test100-5.asp ↑テスト実行 実行結果 商品CD 合計金額 A001 220 B002 300 CCCC 1700 DDDDD 5000 ↑やっと複数テーブルから集計できたのかな?

/* * 7.終わりの挨拶 </HTML> */

今回は、 ・構造が同じ複数のテーブルをUNIONでつなげた ・UNIONとUNION ALLの違い ・UNIONでつなげたテーブルに対してSUM,Group Byしてみた そんなところがポイントかな。 無駄な部分多いですが、集計処理の一つの案として、受け取ってください。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: