I have the following tables:
Person (id, name, address)
Person_subscription (id, person_id, status)
Does a person have many subscriptions but no active one? get that person as ‘Ex-Customer’
Does a person have an active subscription? get that person as ‘Customer’
Ignore customers who don’t have any subscriptions.
x
SELECT person_id,
CASE
WHEN status = 'inactive' then 'Ex-Customer'
WHEN status = 'active' then 'Customer'
END AS account_status
FROM person_subscription
WHERE person_id = '1'
group by company_id;
The above query will bring out the selected person as an example.
person_id | account_status
1 | Ex-Customer
1 | Customer
But I’ll have two rows with conflicting values. My goal is to unify those rows into one and determine the condition set above.
SELECT person_id, status
FROM person_subscription
WHERE NOT EXISTS (
SELECT * FROM company_subscription
WHERE status='active'
)
The above query doesn’t yield any results.
What’s my best bet here, how to proceed?
Advertisement
Answer
You can use distinct on
:
SELECT DISTINCT ON (person_id) person_id,
(CASE WHEN status = 'inactive' then 'Ex-Customer'
WHEN status = 'active' then 'Customer'
END) AS account_status
FROM person_subscription
WHERE person_id = 1
ORDER BY person_id, status ASC;