마농님, 정리한 내용 다시 올려드립니다.
A, B 두개의 Class에 제공되는 끼니는 각각 3끼와 2끼입니다.
class | portion_cnt |
A | 3 |
B | 2 |
class | seq | order_cnt | Meal1 | Meal2 | Meal3 |
A | 1 | 2 | MN1 | MN1 | MN1 |
A | 2 | 1 | MN2 | MN3 | MN2 |
B | 3 | 1 | MN4 | MN4 | |
B | 4 | 1 | MN5 | MN5 | |
B | 5 | 1 | MN6 | MN6 | |
B | 6 | 5 | SP1 | SP2 |
WITH t2 AS ( SELECT 'A' class, 1 seq, 2 order_cnt, 'MN1' Meal1, 'MN1' Meal2, 'MN1' Meal3 FROM dual UNION ALL SELECT 'A', 2, 1, 'MN2', 'MN3', 'MN2' FROM dual UNION ALL SELECT 'B', 3, 1, 'MN4', 'MN4', '' FROM dual UNION ALL SELECT 'B', 4, 1, 'MN5', 'MN5', '' FROM dual UNION ALL SELECT 'B', 5, 1, 'MN6', 'MN6', '' FROM dual UNION ALL SELECT 'B', 6, 5, 'SP1', 'SP2', '' FROM dual ) -- t2 만 이용해 풀었습니다. -- 모든 메뉴가 'SP', 'MN' 으로 시작한다는 가정으로 풀었습니다. -- 'MN' 외에도 다른 메뉴가 있다면 mn 을 주석부분으로 대체하세요 SELECT SUM(order_cnt * (sp + mn)) cnt FROM (SELECT class , seq, order_cnt , SIGN(INSTR(Meal1||Meal2||Meal3, 'SP')) sp , REGEXP_COUNT(Meal1||Meal2||Meal3, 'MN') mn --, CASE WHEN Meal1 NOT LIKE 'SP%' THEN 1 ELSE 0 END --+ CASE WHEN Meal2 NOT LIKE 'SP%' THEN 1 ELSE 0 END --+ CASE WHEN Meal3 NOT LIKE 'SP%' THEN 1 ELSE 0 END mn FROM t2 ) ;