CASE式を使ったクエリで条件式が11レベル以上の場合の抽出方法はあるか

このQ&Aのポイント
  • SQLSERVER2005の環境で、テーブル「TBL」には「MONEY1」から「MONEY12」までのフィールドがあります。
  • MONEYの後ろの数字は月を表しており、条件としては、MONEY12から順に0円でない月まで遡り、その月の金額を求めたいというものです。
  • しかし、CASE式を使用して条件式を11レベル以上にすると、「Case 式は、10 レベルまでしか入れ子にできません。」というエラーが発生します。
回答を見る
  • ベストアンサー

CASE式を使ったクエリ

<環境>SQLSERVER2005 件名について教えてください。 テーブル("TBL")にフィールドMONEY1~MONEY12までがあります。 MONEYの後ろの数字は月を表しています。 このテーブルから 1.MONEY12の値≠0円ならMONEY12の値。MONEY12の値=0円ならMONEY11の値を参照。 2.MONEY11の値≠0円ならMONEY11の値。MONEY11の値=0円ならMONEY10の値を参照。 3.MONEY10の値≠0円ならMONEY10の値。MONEY10の値=0円ならMONEY9の値を参照。 と0円でない月までさかのぼってその月の金額を求めたいのですが、 下記のようにCASE式を使うと「Case 式は、10 レベルまでしか入れ子にできません。」と エラーになります。 条件式が11レベル以上の場合抽出する方法はないのでしょうか SELECT CASE WHEN MONEY12>0 THEN MONEY12 ELSE CASE WHEN MONEY11>0 THEN MONEY11 ELSE CASE WHEN MONEY10>0 THEN MONEY10 ELSE CASE WHEN MONEY9>0 THEN MONEY9 ELSE CASE WHEN MONEY8>0 THEN MONEY8 ELSE CASE WHEN MONEY7>0 THEN MONEY7 ELSE CASE WHEN MONEY6>0 THEN MONEY6 ELSE CASE WHEN MONEY5>0 THEN MONEY5 ELSE CASE WHEN MONEY4>0 THEN MONEY4 ELSE CASE WHEN MONEY3>0 THEN MONEY3 ELSE CASE WHEN MONEY2>0 THEN MONEY2 ELSE CASE WHEN MONEY1>0 THEN MONEY1 ELSE 0 END END END END END END END END END END END END FROM TBL

noname#208236
noname#208236

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

試していないので自信ありませんが、 case when money12<>0 then 'MONEY12' when money11<>0 then 'MONEY11' when money10<>0 then 'MONEY10' when money9<>0 then 'MONEY9' when money8<>0 then 'MONEY8' when money7<>0 then 'MONEY7' when money6<>0 then 'MONEY6' when money5<>0 then 'MONEY5' when money4<>0 then 'MONEY4' when money3<>0 then 'MONEY3' when money2<>0 then 'MONEY2' else money1<>0 then 'MONEY1' end の要領で取得できませんか。

noname#208236
質問者

お礼

ありがとうございました。 できました。

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

select coalesce( nullif(MONEY12,0), nullif(MONEY11,0), nullif(MONEY10,0), nullif(MONEY9,0), nullif(MONEY8,0), nullif(MONEY7,0), nullif(MONEY6,0), nullif(MONEY5,0), nullif(MONEY4,0), nullif(MONEY3,0), nullif(MONEY2,0), MONEY1 ) from じゃだめですかね。

noname#208236
質問者

お礼

できました。 COALESCE 関数を初めて知りました。 一つ便乗して質問してもよろしいでしょうか? このクエリで0円でない値までさかのぼって値を取得することはできたのですが、 取得した時のフィールド名を取得することはできるのでしょうか? よろしくお願いします。

関連するQ&A

  • CASE文について

    <環境> SQLSERVER2005 ACCESS2007 CASE文について質問です。 クエリで下記のSQL文を実行すると、「Case 式は、10 レベルまでしか入れ子にできません。」 とエラーになります。 このような場合、どのように記述すれば解決できるでしょうか? ご教授お願いします。 SELECT CASE WHEN (WA.MM = '01') THEN ROUND(SUM(WB.MONEY1), -3, 0) ELSE CASE WHEN (WA.MM = '02') THEN ROUND(SUM(WB.MONEY2), -3, 0) ELSE CASE WHEN (WA.MM = '03') THEN ROUND(SUM(WB.MONEY3), -3, 0) ELSE CASE WHEN (WA.MM = '04') THEN ROUND(SUM(WB.MONEY4), -3, 0) ELSE CASE WHEN (WA.MM = '05') THEN ROUND(SUM(WB.MONEY5), -3, 0) ELSE CASE WHEN (WA.MM = '06') THEN ROUND(SUM(WB.MONEY6), -3, 0) ELSE CASE WHEN (WA.MM = '07') THEN ROUND(SUM(WB.MONEY7), -3, 0) ELSE CASE WHEN (WA.MM = '08') THEN ROUND(SUM(WB.MONEY8), -3, 0) ELSE CASE WHEN (WA.MM = '09') THEN ROUND(SUM(WB.MONEY9), -3, 0) ELSE CASE WHEN (WA.MM = '10') THEN ROUND(SUM(WB.MONEY10), -3, 0) ELSE CASE WHEN (WA.MM = '11') THEN ROUND(SUM(WB.MONEY11), -3, 0) ELSE CASE WHEN (WA.MM = '12') THEN ROUND(SUM(WB.MONEY12), -3, 0) END END AS MONEY FROM (WA INNER JOIN WB ON (WA.YYYY = WB.YYYY)) INNER JOIN WC ON (WA.YYYY = WC.YYYY)

  • PostgresqlのCASE分の使い方

    SELECT MAX(CASE WHEN fld IS NULL THEN 0 ELSE fld END) FROM tbl ; tblテーブルのfldの最大値を取得するSQLを作りたいのですが、tblテーブルにレコードが登録されていない時に「0」を出力したいと思っています。 上記のSQLだとレコードが0の場合はfldの値がないため、0を出力してくれません。 どのように修正すればレコード0件のときに「0」を出力してくれるでしょうか。 宜しくお願いします。

  • CASEの中にCASE

    CASE WHEN c1 IS NOT NULL THEN 'OK' ELSE (CASE WHEN c2 IS NOT NULL THEN 'OK' ELSE 'NO' ) END AS kekka; こういうようなCASEの中にCASEを使う方法はありますでしょうか?

  • WHERE句でのCASEについて

    WHERE句でのCASEの使い方についてご教授下さい。 以下の3分岐でSELECTしようとしています。 項目A=1なら、 項目B / 1000=10 のデータを。 項目A=2なら、 項目C=C のデータを。 項目A=3なら、 項目B / 1000=10 かつ項目D=D のデータを。 ※しばらくPCに触れないので確認不可ですが以下は試みたい方法です。 ただ心配なのは、例えば項目A=1のときに項目B / 1000 = 10を満たすデータと満たさないデータが存在する場合、 満たすデータまでもが抽出されないのではという心配があります。 SELECT * FROM テーブル WHERE 1 = CASE WHEN 項目A=1 THEN CASE WHEN 項目B / 1000 = 10 THEN 1 ELSE END WHEN 項目A=2 THEN CASE WHEN 項目C = C THEN 1 ELSE END WHEN 項目A=3 THEN CASE WHEN 項目B / 1000 = 10 AND 項目D = D THEN 1 ELSE END ELSE END

  • caseを使った条件分岐の加算がうまくいかない

    SQLで条件によって加算するか、しないかを判定したいと思っています。 ■テーブル:test name,flag,number mike,4,1 mike,4,2 mike,5,3 mike,6,4 mike,7,5 mike,8,6 mike,9,7 ■書いたSQL SELECT test.name AS "name", (CASE WHEN flag = '4' THEN sum(number) ELSE NULL END) AS "4", (CASE WHEN flag = '5' THEN sum(number) ELSE NULL END) AS "5", (CASE WHEN flag = '6' THEN sum(number) ELSE NULL END) AS "6", (CASE WHEN flag = '7' THEN sum(number) ELSE NULL END) AS "7", (CASE WHEN flag = '8' THEN sum(number) ELSE NULL END) AS "8", (CASE WHEN flag = '9' THEN sum(number) ELSE NULL END) AS "9" FROM test GROUP BY test.name ■結果 4,5,6,7,8,9 null,null,null,null,null,28 欲しい結果は、フラグが4ののものの合計。flagが「4」の場合は、「3」という結果が返ってきてもらいたいです。 flagが5の場合は、3が返ってきてもらいたいです。 SQLが間違っているのですが、どこが間違っているのかわかりません。どのように修正すればよろしいでしょうか?よろしくお願いします。 環境はSQLiteを使用しています。

  • 条件分岐 case文での文字列の連結方法

    SELECT CASE WHEN 項目1 = 1 THEN '月' END+ CASE WHEN 項目1 = 2 THEN '火' END+ CASE WHEN 項目1 = 3 THEN '水' END AS 曜日 FROM テーブル1 として、文字列を「月火水」と続けたいのですが、NULLが表示され上手く行きません。 解決方法をご教示お願い致します。

  • 2つの条件を満たすのレコードのカラムを抽出する方法について

    下記のテーブルがあったとします。 【t_tblテーブル】 ――――――――――――― |id1  |id2 |id3  | ――――――――――――― |1   |1  |10   | |1   |2  |12   | |1   |3  |9   | |1   |4  |8   | |1   |5  |14   | |2   |1  |14   | |2   |2  |8   | |2   |3  |9   | |2   |4  |12   | |2   |5  |10   | |3   |1  |4   | |3   |2  |2   | |3   |3  |3   | |3   |4  |5   | |3   |5  |6   | |4   |1  |6   | |4   |2  |5   | |4   |3  |3   | |4   |4  |2   | |4   |5  |4   | ――――――――――――― このテーブルの特定のレコードを抽出する為に、 2つパラメータを渡すとします。 1. 12 2. 8 そして下記の条件を満たすレコードのid1を抽出したいと思います。 1. 「id3」 = 「12」 かつ 「id3」 = 「8」 を満たすid1 (※この時点で1と2がヒットします) 2. 条件1を満たした上で、「12」のid2 < 「8」のid2 (※この時点で1のみヒットします) 下記のSQLで条件1を満たせる事は確認しましたが、 条件2を満たす方法が分かりませんでしたので、 アドバイスいただける方がいらっしゃいましたら、 ご教示いただきたいと思います。 select id1 from t_tbl group by id1 Having SUM(CASE WHEN id3=12 Then 1 Else 0 End)>0 And SUM(CASE WHEN id3=8 Then 1 Else 0 End)>0 使用バージョンは7.4.19です。 よろしくお願いします。

  • 計算結果をCASE WHENで判断したとき、ELSEで計算結果をそのまま持ってくるSQL文法は?

    SQL SERVER2005を使用しています。 テーブルAがあり、Aが持つフィールド「suuchi」には数値が入っているとします。 suuchiフィールドの値を計算して、その結果が0以上なら計算結果を。負の数なら0を出力するSQL文を書きたいのです。 CASE WHEN を使用して以下のSQLを書きました。 SELECT CASE WHEN ( suuchi*2 + 1 ) < 0 THEN 0 END FROM テーブルA; しかし、結果は計算結果が負の数の場合は「0」になりますが、0以上の場合が表示されませんでした。 理由は、CASE WHEN でELSEを省略した場合、結果がNULLになるためと思われます。 以下のSQLでは期待とおりの結果が得られます。 SELECT CASE WHEN ( suuchi*2 + 1 ) < 0 THEN 0 ELSE ( suuchi*2 + 1 ) END FROM テーブル; しかし、同じ計算式を2回書くのは今一正しくないように思えます。 CASE WHEN で計算結果を判断した場合、ELSEでは計算済みの結果を取ることはできないのでしょうか? 上は例として書いたので簡単な計算式ですが、実際私が業務で使用している計算式はかなり長いため できれば式を2回書くことを避けたいのです(SQL文が長くなるため)。 計算結果に一時的に別名をつけようとして、以下のようなSQL文を書いたのですが「AS 付近にエラーがあります」といわれます。 SELECT CASE WHEN ( suuchi*2 + 1 ) AS TMPFIELD < 0 THEN 0 ELSE TMPFIELD END FROM テーブル; 質問は2点です。 1) 計算式の結果をCASE WHEN で判断した場合、ELSEの時は計算結果を取得したい場合は、再度同じ計算式を書く必要がありますか? 2) 上の答えが「必要ない」場合、上記条件を満たすSQLの書き方をご教示いただけませんでしょうか? なお、質問文の文章、SQLServerの環境の記述不足、SQL文等で意味不明な箇所がありましたらご指摘ください。 以上です。よろしくお願いします。

  • SQL SERVER 同一クエリ内での別名参照

    いつもお世話になります。 下記内容のクエリを作成したのですが、「エラー:列名’支給割合’が無効です」と表示されてしまいます。 SELECT CASE WHEN 種別 = 'A' THEN 0.5 ELSE 0.3 END AS 支給割合, CASE WHEN 進捗 = '完了' THEN ISNULL(粗利, 0) * 支給割合 ELSE NULL END AS 支給分 FROM dbo.取引マスタ 種別より、CASE式で支給割合を作成し、進捗より粗利に対して支給割合を掛ける関数を作成しようと思ったのですが、上記の通りエラーになってしまいます。 Accessと同様に同一のクエリ内で式に別名を指定して参照は出来ないのでしょうか?(表現が下手で申し訳ありません) ここからさらにCASE式を足して最終粗利益等を作成したいのですが・・・・ 使用DB:SQL Server 2008 R2 express edition 検索でも目当ての回答が見つけられず、こちらで質問をさせて頂きました。 ご教授を宜しくお願いいたします。

  • MySQLでWHEN句のサブクエリ中にて

    MySQL ver.5.0.95です。 PHPからSQL文を作ってDBへインサートしているのですが 重複した値が合った場合はupdateするように書いています。 TBL1には |id   |string   |count 1    aaa    0 2    bbb    3 3    ccc    1 TBL2には |id2    |string2    |count2 1      aaa      0 2      bbb      2 3      ccc      1 実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。 このとき、TBL1のそれぞれをインサート若しくはアップデートするのに TBL2の同一IDのものの、count2の状態によって場合分けしたく 同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが insert into TBL1 values (1, "aaa", 3), (2, "bbb", 3), (3, "ccc", 3), (4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END; #1064 - You have an error in your SQL syntax;というエラーになって出来ません。 WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。 例えば決め撃ちで1つ1つ書くと通ります。 insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END; これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか? あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、 変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。 まとめると速くなることはあるでしょうか?

    • ベストアンサー
    • MySQL