Как написать оператор case в предложении Where Oracle SQL?

Подскажите пожалуйста эту проблему.

TABLE:PPP
+-------+---------+---------+----------+
|No     |  Flag_A | Flag_B  |   Qty    |
+-------+---------+---------+----------+
|100    |    P    |    0    |    10    |
|300    |    B    |    1    |    20    |
|500    |    C    |    0    |    30    |
|100    |    P    |    0    |    40    |
|100    |    P    |    0    |    50    |
|300    |    B    |    1    |    60    |
|500    |    C    |    1    |    70    |
|100    |    P    |    0    |    80    |
|500    |    B    |    2    |    90    |
+-------+---------+---------+----------+

SELECT NO, SUM(QTY) AS QTY 
  FROM PPP
 WHERE 
   CASE FLAG_B IN (
     WHEN FLAG_A = 'P' THEN '0'
     WHEN FLAG_A = 'C' THEN '1'
     WHEN FLAG_A = 'B' THEN '0' , '1' <- how to write? 
    END
   )
GROUP BY NO

Я хочу получить этот результат.

+----+-----+
| No | Qty | 
+----+-----+
| 100|  180|
| 300|   80|
| 500|  100|
+----+-----+

Что я должен написать sql?

кажется невозможным получить Qty=100 для No=500...

Barbaros Özhan 14.12.2020 11:32

Странно, что столбец под названием «флаг» будет иметь значение «2».

Gordon Linoff 14.12.2020 13:21
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
106
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это было бы проще сформулировать с помощью булевой логики:

where (flag_a = 'P' and flag_b = 0)
   or (flag_a = 'C' and flag_b = 1)
   or (flag_a = 'B' and flag_b in (0, 1))

Мы можем немного факторизовать:

where (flag_a in ('B', 'P') and flag_b = 0)
   or (flag_a in ('B', 'C') and flag_b = 1)

Или мы можем использовать равенство кортежей:

where (flag_a, flag_b) in (('P', 0), ('C', 1), ('B', 0), ('B', 1))

flag_b выглядит как число, поэтому я сравнил его с буквальными числами; если это действительно строка, то вы можете добавить одинарные кавычки вокруг литералов.

Мне очень жаль за поздний ответ. Я попробовал, и это сработало! Большое спасибо!!

piyo_lune 17.12.2020 11:06

Использование функции DECODE(), содержащей выражение CASE..WHEN для случая flag_a='B', может быть альтернативным способом получения желаемых результатов, таких как

SELECT no, SUM(qty) AS qty
  FROM ppp
 WHERE DECODE(flag_a,'P',0,'C',1,'B', CASE WHEN flag_b IN (0,1) THEN flag_b END)=flag_b
 GROUP BY no

Demo

P.S: Я думаю, что есть проблема, которую нужно исправить, с данными для No=500

Другие вопросы по теме