[三流君] −−>
[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でした。
フィードバック
ASP系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告