老親介護に悩む30~60代の方へ
老親介護ねっと[老人ホーム編]
トップ 老人ホームの選び方 介護関連ニュース 新規オープンホーム情報 老人ホーム取材レポート お問い合わせ リンク集 Q&A

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

やりたいこととしては、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

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

投稿日時 - 2018-04-24 14:56:29

QNo.9491866

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2018-04-25 14:18:01

ANo.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

投稿日時 - 2018-04-24 15:29:11

お礼

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

ANo.1

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

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

投稿日時 - 2018-04-24 15:26:08

お礼

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

投稿日時 - 2018-04-24 18:22:46