解決済み

SQL。項目内のフラグを判断して、SUMしたい。

  • すぐに回答を!
  • 質問No.9491866
  • 閲覧数167
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 98% (58/59)

やりたいこととしては、ymdとnoとidで一つにデータをまとめ、
各レコードの持つフラグ(a,b)の状態次第(両方trueならば)で、
SUMする項目(num1,num2)を適切に変更したいです。

下記みたいな感じでやってみたものの、まとめ方が悪いらしく期待した答えが出せません。
(何だかんだいじってみても同様、そして、張り付けたSQLは多分エラー。)

考え方が悪いのか、やり方が悪いのか、どなたかご教示いただきたく、よろしくお願いします。

----------------------------------------
実行SQL

select
ymd,no,id,
SUM(
  case
    when max(a) and max(b)
      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

----------------------------------------
期待している答え

ymd,no,id,abc
20180423,1,1,500
20180424,1,1,900
20180424,1,2,700

----------------------------------------

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

  • 回答No.3

ベストアンサー率 100% (19/19)

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-

お礼率 98% (58/59)

よかったよかったとなってしまい、すっかり見ておらず、反応がだいぶ遅くなりました。
確かに、流してみたら期待した結果が得られました。

単純にSUMの中でのCase文の動作の理解が足りないようですね。。。MAXでまとめられるか!?とかやってるあたり。
投稿当時を思い出しながら、もうちょっと確認してみようと思います。

本当に、ありがとうございました。
投稿日時 - 2018-06-22 10:29:15

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 100% (19/19)

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-

お礼率 98% (58/59)

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型で直接は変えられないので、ワンクッション入れて、とりあえず上記のようにしてみました。
期待した結果が取れたと思います。

もう少し付け加えるものもあるので、改変して試してみたいと思います。

助かりました。ありがとうございます。
投稿日時 - 2018-04-24 18:15:59
  • 回答No.1

ベストアンサー率 15% (196/1228)

考え方が悪いでしょうね。

一応技術者ってことで。
SQLの話をするなら、まずはテーブルの構造を明示してからですね。
お礼コメント
kumasangao-

お礼率 98% (58/59)

情報が足りずに、申し訳ありませんでした。
アドバイスのほどありがとうございます。
投稿日時 - 2018-04-24 18:22:46
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

ピックアップ

ページ先頭へ