You need to include a GROUP BY
clause and can use conditional aggregation:
SELECT order#,
MAX(CASE status WHEN 'Fulfilled' THEN 1 ELSE 0 END) AS is_fulfilled,
MAX(CASE status WHEN 'Dispatched' THEN 1 ELSE 0 END) AS is_dispatched,
MAX(CASE status WHEN 'Approved' THEN 1 ELSE 0 END) AS is_approved,
MAX(CASE status WHEN 'Cancelled' THEN 1 ELSE 0 END) AS is_cancelled,
MAX(CASE status WHEN 'Initiated' THEN 1 ELSE 0 END) AS is_initiated
FROM orders
GROUP BY order#
Which, for the sample data:
CREATE TABLE orders (order#, status) AS
SELECT 'A123', 'Fulfilled' FROM DUAL UNION ALL
SELECT 'A123', 'Dispatched' FROM DUAL UNION ALL
SELECT 'A123', 'Approved' FROM DUAL UNION ALL
SELECT 'A123', 'Initiated' FROM DUAL UNION ALL
SELECT 'A456', 'Cancelled' FROM DUAL UNION ALL
SELECT 'A456', 'Initiated' FROM DUAL UNION ALL
SELECT 'B123', 'Fulfilled' FROM DUAL UNION ALL
SELECT 'B123', 'Dispatched' FROM DUAL UNION ALL
SELECT 'B123', 'Initiated' FROM DUAL UNION ALL
SELECT 'B456', 'Fulfilled' FROM DUAL UNION ALL
SELECT 'B456', 'Approved' FROM DUAL UNION ALL
SELECT 'B456', 'Initiated' FROM DUAL;
Outputs:
ORDER# |
IS_FULFILLED |
IS_DISPATCHED |
IS_APPROVED |
IS_CANCELLED |
IS_INITIATED |
A123 |
1 |
1 |
1 |
0 |
1 |
A456 |
0 |
0 |
0 |
1 |
1 |
B123 |
1 |
1 |
0 |
0 |
1 |
B456 |
1 |
0 |
1 |
0 |
1 |
fiddle