Подскажите пожалуйста эту проблему.
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?
Странно, что столбец под названием «флаг» будет иметь значение «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
выглядит как число, поэтому я сравнил его с буквальными числами; если это действительно строка, то вы можете добавить одинарные кавычки вокруг литералов.
Мне очень жаль за поздний ответ. Я попробовал, и это сработало! Большое спасибо!!
Использование функции 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
P.S: Я думаю, что есть проблема, которую нужно исправить, с данными для No=500
кажется невозможным получить Qty=100 для No=500...