- ベストアンサー
表どうしで演算するSQLについて
SQLについて質問です。 コードと値(数値型)で構成されている表が3つある(A、B、C)とします。 そして、下記のようにコードをキーに値の演算をしたいと 思っています。 select A.値 - B.値 + C.値 as z from・・ この時にコードがない時(たとえばAにB,Cと同じコードない時)は、A.値(=0)+B.値(=3)+C.値(=7)のように0をセットして、要は3つのの表の最大レコード数分の演算値を取得したいのですが、どのようにSQLを記述すれば良いでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 ※どのDBMSかわかりませんが、SQL Serverを基準に解説します。 方法は何通りかあると思いますが、以下に2つの方法を明記します。 1.元になるコードのマスタを利用する。 この方法はマスタがあればそれを基準に外部結合し、結合できないテーブルに「NULL値は別の値に置き換え」の関数(ISNULL)を使用します。 例)マスタテーブルを仮に「マスタ」とします。 SELECT ISNULL(A.値,0) - ISNULL(B.値,0) + ISNULL(C.値,0) AS 結果 FROM マスタ LEFT OUTER JOIN A ON マスタ.コード = A.コード LEFT OUTER JOIN B ON マスタ.コード = B.コード LEFT OUTER JOIN C ON マスタ.コード = C.コード マスタがない場合は、3テーブルのコードのみをUNION結合し、それをFROMに使用する。 例)上記例の「FROM マスタ」を以下に置き換える FROM ( SELECT DISTINCT コード FROM ( SELECT コード FROM A UNION ALL SELECT コード FROM B UNION ALL SELECT コード FROM C ) ) AS マスタ 2.外部全結合(FULL OUTER JOIN)を使用して、すべての組み合わせを作成する すべての値を取得するために、AとBのすべての結合を作成し、その後この結合とCをさらにすべて結合します。 AとBの結合の際、コードがどちらにあるのか分かりませんので、CASE文を使ってあるほうを取得しておきます。 例) SELECT ISNULL(AB.値1,0) - ISNULL(AB.値2,0) + ISNULL(C.値,0) AS 結果 FROM ( SELECT CASE ISNULL(A.コード,'') WHEN '' THEN B.コード ELSE A.コード END AS コード, A.値 AS 値1,B.値 AS 値2 FROM A FULL OUTER JOIN B ON A.コード = B.コード ) AB FULL OUTER JOIN C ON AB.コード = C.コード とにかく3つのテーブルにあるすべてのコードをいかに結合するかだと思います。 ※実際に検証していませんので、実行時エラーが出るかもしれません (^^ゞ ※WEB上だとネストの表現ができないために見にくくなっています。テキストエディタなどでネストをつけてご覧ください。 お試しください。
その他の回答 (2)
- tsukasa-12r
- ベストアンサー率65% (358/549)
Aに、B、Cと同じコードがないときはA値=0 Bに、A、Cと同じコードがないときはB値=0 Cに、A、Bと同じコードがないときはC値=0 ということですよね? それでしたら、まず、 select code from A union select code from B union select code from C のように、UNION クエリーを作成し、 これに対して、A、B、C を外部結合し、 NVL か NZ のような関数を使用して計算させればよいと思います。
お礼
御回答頂き有難うございました。 とても勉強になりました。
- MomijiPanda
- ベストアンサー率50% (13/26)
DBは何をお使いでしょうか? Oracleの場合は NVL Accessの場合は NZ という関数が用意されています。 これを使うと、Nullの場合に0もしくは(NVLの場合)指定値が返却されます。
お礼
御回答頂き有難うございました。
お礼
御回答頂き有難うございました。 とても勉強になりました。