• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL。項目内のフラグを判断して、SUMしたい。)

SQLでのフラグ判断とSUM

このQ&Aのポイント
  • SQLを使用して、項目内のフラグを判断してSUMする方法について教えてください。
  • 期待する結果が得られないため、考え方ややり方についてアドバイスをいただきたいです。
  • 提供されたSQLを使用して、ymd、no、idごとにフラグの状態によってSUMする項目を変更する方法を教えてください。

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

  • ベストアンサー
  • aa_akiya
  • ベストアンサー率100% (21/21)
回答No.3

No.1の回答で言葉足らずでした。 手近な実行環境がSQLSERVERでboolean型に対応していなかったのでtrueとfalseを文字列に置き換えて実行していました。 わざわざ変換しなくても動きます。 Oracleの環境は無いのですが、MySQLで動作したのでOracleでも問題ないと思います。 ---------------------------------------- select ymd,no,id, SUM(   case     when a = true and b = true       then         num1   else     num2   end ) abc from (   select     '20180423' ymd,1 no,1 id,true a,true b,100 num1,300 num2   union   select     '20180423' ymd,1 no,1 id,false a,true b,200 num1,400 num2   union   select     '20180424' ymd,1 no,1 id,false a,false b,300 num1,500 num2   union   select     '20180424' ymd,1 no,1 id,true a,true b,400 num1,600 num2   union   select     '20180424' ymd,1 no,2 id,false a,true b,500 num1,700 num2 )table_1 group by ymd,no,id

kumasangao-
質問者

お礼

よかったよかったとなってしまい、すっかり見ておらず、反応がだいぶ遅くなりました。 確かに、流してみたら期待した結果が得られました。 単純にSUMの中でのCase文の動作の理解が足りないようですね。。。MAXでまとめられるか!?とかやってるあたり。 投稿当時を思い出しながら、もうちょっと確認してみようと思います。 本当に、ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • aa_akiya
  • ベストアンサー率100% (21/21)
回答No.2

trueとfalseを文字列として、少し改変しました。 試したところ期待通りの結果が出力されました。 ----------------------- select ymd,no,id, SUM(   case     when a = 'true' and b = 'true'       then         num1   else     num2   end ) abc from (   select     '20180423' ymd,1 no,1 id,'true' a,'true' b,100 num1,300 num2   union   select     '20180423' ymd,1 no,1 id,'false' a,'true' b,200 num1,400 num2   union   select     '20180424' ymd,1 no,1 id,'false' a,'false' b,300 num1,500 num2   union   select     '20180424' ymd,1 no,1 id,'true' a,'true' b,400 num1,600 num2   union   select     '20180424' ymd,1 no,2 id,'false' a,'true' b,500 num1,700 num2 )table_1 group by ymd,no,id

kumasangao-
質問者

お礼

select ymd,no,id, max(a) a,max(b) b, SUM(   case     when a='true' and b='true' then num1     else num2   end ) abc from ( select ymd,no,id ,case   when a = true then 'true'   when a = false then 'false'   else 'null' end a ,case   when b = true then 'true'   when b = false then 'false'   else 'null' end b ,num1,num2 from (   select     '20180423' ymd,1 no,1 id,true a,true b,100 num1,300 num2   union   select     '20180423' ymd,1 no,1 id,false a,true b,200 num1,400 num2   union   select     '20180424' ymd,1 no,1 id,false a,false b,300 num1,500 num2   union   select     '20180424' ymd,1 no,1 id,true a,false b,400 num1,600 num2   union   select     '20180424' ymd,1 no,2 id,false a,true b,500 num1,700 num2 )table_1 )table_2 group by ymd,no,id なるほど。 文字列にするとまとまるとは、今の頭じゃ理解に至れないですね。 元テーブルはboolean型で直接は変えられないので、ワンクッション入れて、とりあえず上記のようにしてみました。 期待した結果が取れたと思います。 もう少し付け加えるものもあるので、改変して試してみたいと思います。 助かりました。ありがとうございます。

すると、全ての回答が全文表示されます。
  • okwavey2
  • ベストアンサー率15% (251/1593)
回答No.1

考え方が悪いでしょうね。 一応技術者ってことで。 SQLの話をするなら、まずはテーブルの構造を明示してからですね。

kumasangao-
質問者

お礼

情報が足りずに、申し訳ありませんでした。 アドバイスのほどありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A