- PR -

SQL勉強中 結合の仕方教えてください

投稿者投稿内容
とみ
会議室デビュー日: 2005/01/20
投稿数: 10
投稿日時: 2005-01-20 11:54
3日前からSQL勉強中のトミと申します。
どなたか教えていただければと思うのですが・・・

@SELECT USER_ID , SUM(KINGAKU) "HARAI_200110"
FROM T_HARAI
WHERE SUBSTR(HARAI_DATE,1,6) = '200110'
GROUP BY USER_ID ;
/*実行結果*/↓
USER_ID HARAI_200110
-------------------- ------------
TZW 520000
ZSR 6500

ACSELECT USER_ID , SUM(KINGAKU) "KARIBARAI_200110"
FROM T_KARIBARAI
WHERE SUBSTR(HARAI_DATE,1,6) = '200110'
GROUP BY USER_ID ;
/*実行結果*/↓
USER_ID KARIBARAI_200110
-------------------- ----------------
MORI 2000
TZW 1150000
ZSR 135300

上記の@,Aをあわせた合計金額として
USER_ID (SUM(T_HARAI.KINGAKU)+SUM(T_KARIBARAI.KINGAKU))
--------- ----------------------------
MORI 2000
TZW 1670000
ZSR 141800
↑を導き出したいのですがうまくいきません。
UNIONを使えばよいのでしょうか、
それとも複数の表から情報を得る手段として
表(T_HARAIとT_KARIBARAI)を結合すればよいのでしょうか
それとも副問い合わせの形式を使うのでしょうか?
HARAI_DATE が 2000年10月又は2001年10月の両テーブルの KINGAKU の合計値をユーザごとに求めたいのですが…

mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2005-01-20 12:22
msoです。


せめて、DBは何を使っているのかを明確にしたほうが
より適切な回答があるとおもいますが。。。


えっと、@とAをそれぞれインラインビューにして、
求めてはどうでしょうか?
とみ
会議室デビュー日: 2005/01/20
投稿数: 10
投稿日時: 2005-01-20 12:39
失礼致しました。
DBはオラクルを使っています。
未記入
会議室デビュー日: 2005/01/20
投稿数: 3
投稿日時: 2005-01-20 13:01
SELECT USER_ID,SUM(HOGE) AS KINGAKU
FROM (
SELECT USER_ID , SUM(KINGAKU) AS HOGE
FROM T_HARAI
WHERE SUBSTR(HARAI_DATE,1,6) = '200110'
GROUP BY USER_ID
UNION ALL
SELECT USER_ID , SUM(KINGAKU) AS HOGE
FROM T_KARIBARAI
WHERE SUBSTR(HARAI_DATE,1,6) = '200110'
GROUP BY USER_ID
) AS HOGETABLE
GROUP BY USER_ID ;

一番簡単なパターンですが、間違っていたらすいません。
未記入
会議室デビュー日: 2005/01/20
投稿数: 3
投稿日時: 2005-01-20 13:07
追記です。

substrを集計に使うとテーブル全件なめる必要があるのでお勧めできません。
HARAI_DATE LIKE '200110%"であればインデックス張っていれば取得できますのでこちらのほうがまだいいと思います。
とみ
会議室デビュー日: 2005/01/20
投稿数: 10
投稿日時: 2005-01-20 13:48
返信くださった皆様ありがとうございます。
皆さんのおかげでここまで求めることが出来ました↓

BSELECT USER_ID,SUM(KINGAKU2001) AS TOUGETU
FROM (
SELECT USER_ID , SUM(KINGAKU) AS KINGAKU2001
FROM T_HARAI
WHERE HARAI_DATE LIKE '200110%'
GROUP BY USER_ID
UNION ALL
SELECT USER_ID , SUM(KINGAKU) AS KINGAKU2001
FROM T_KARIBARAI
WHERE HARAI_DATE LIKE '200110%'
GROUP BY USER_ID
)
GROUP BY USER_ID ;


USER_ID KINGAKU
-------------------- ----------
MORI 2000
TZW 1670000
ZSR 141800

上と同じようにもうひとつ求めました。↓

CSELECT USER_ID,SUM(KINGAKU2000) AS ZEN_DOUGETU
FROM (
SELECT USER_ID , SUM(KINGAKU) AS KINGAKU2000
FROM T_HARAI
WHERE HARAI_DATE LIKE '200010%'
GROUP BY USER_ID
UNION ALL
SELECT USER_ID , SUM(KINGAKU) AS KINGAKU2000
FROM T_KARIBARAI
WHERE HARAI_DATE LIKE '200010%'
GROUP BY USER_ID
)
GROUP BY USER_ID ;

USER_ID ZEN_DOUGETU
-------------------- -----------
ADC 122000
KAT 2250000
KOJIMA 1000
MKA 75000
MORI 128820
NKMR 550000
NOZUKI 55000
NRC 201120
OBA 55000
OTANI 138800
TANIGUCHI 51340
TEZ 247400
TOMI 320000
TZW 1130000
WADA 194980
WTS 550000
YAMATO 70000
YKS 253000
ZSR 28700
nishi 112030

BとCから

USER_ID ZEN_DOUGETU TOUGETU
-------------------- ----------- -----------
ADC 122000 0
KAT 2250000 0
KOJIMA 1000 0
MKA 75000 0
MORI 128820 2000
NKMR 550000 0
NOZUKI 55000 0
NRC 201120 0
OBA 55000 0
OTANI 138800 0
TANIGUCHI 51340 0
TEZ 247400 0
TOMI 320000 0
TZW 1130000 1670000
WADA 194980 0
WTS 550000 0
YAMATO 70000 0
YKS 253000 0
ZSR 28700 141800
nishi 112030 0

を求めるにはどう結合したらいいかも教えていただければうれしいのですが・・・
とみ
会議室デビュー日: 2005/01/20
投稿数: 10
投稿日時: 2005-01-20 14:09
最後の結果の表が見ずらくなってしまったので
もう一度載せます。

USER_ID      ZEN_DOUGETU    TOUGETU
-------------   -----------  -----------
ADC          122000       0
KAT          2250000       0
KOJIMA          1000       0
MKA           75000       0
MORI          128820     2000
NKMR          550000       0
NOZUKI         55000        0
NRC          201120        0
OBA          55000        0  
OTANI         138800       0
TANIGUCHI       51340        0
TEZ          247400       0
TOMI         320000       0
TZW         1130000    1670000
WADA         194980       0
WTS         550000        0
YAMATO        70000        0
YKS         253000        0
ZSR          28700     141800
nishi        112030       0
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-01-20 15:31
横槍で申し訳ありませんが。

入力と出力だけ示して SQL を他の人に作ってもらうのではなく、ご自分でどう考えて、どこまでわかった、どこがわからないかを述べ、わからない点のみ教示していただくという姿勢に改めていただけませんでしょうか。

せめて入力の各行について、どういう場合に出力の対応行がどうなるかくらい、読んだ方に考えさせるのではなく、ご自分で考えてから書き込んでください。
整理ができれば、ご自分でプログラムにするのも容易になると思います。

あと、「副問い合わせ」の中で UNION を作って全体が複雑になり過ぎているきらいがあるので、「CREATE VIEW 文」で SELECT の実行結果を一旦保持した方が、処理の見通しが良くなると思います。

最後に一言。
SQL を始めて三日にしては複雑なことに進みすぎていると感じました。
学習資料として何をお使いかわかりませんが、もう少し初歩から順を追って学習された方がよろしいと思います。

スキルアップ/キャリアアップ(JOB@IT)