I have an SQL table named “DATA” as follows:
x
id plan mode cost. purchaseDate
1. cd3. ANNUALLY 34. 2020-05-04
2. fg45. QUARTERLY 456. 2021-01-02
I’m attempting to return the following 3 columns: plan, planCount, totalCostPerPlan
I’ve been working a query to return this and so far it looks like this:
SELECT
plan,
COUNT(id) as planCount,
CASE
WHEN mode = 'ANNUALLY' THEN SUM(cost)
WHEN mode = 'S/ANNUALLY' THEN SUM(cost * 2)
WHEN mode = 'QUARTERLY' THEN SUM(cost * 3)
WHEN mode = 'MONTHLY' THEN SUM(cost * 12)
ELSE SUM(cost)
FROM DATA
WHERE purchaseDate >= *not important*
GROUP BY plan, mode
ORDER BY plan ASC
It sort of works, however, I get the data only partially grouped as follows:
plan. planCount. totalCostPerPlan
cd3. 5 *not important*
cd3. 600 *not important*
cd3. 32 *not important*
fg45. 1 *not important*
fg45. 10 *not important*
h100. 7 *not important*
(The table is just an example)
How to I further group by plan? I’m trying to obtain the total value for each plan, however, they’re shown with a separate row for each mode. Please assist.
Advertisement
Answer
Hmmm . . . If you want to put factors into the sum()
then the case
is the argument to the sum()
:
SELECT plan, COUNT(id) as planCount,
SUM(CASE WHEN mode = 'ANNUALLY' THEN cost
WHEN mode = 'S/ANNUALLY' THEN cost * 2
WHEN mode = 'QUARTERLY' THEN cost * 3
WHEN mode = 'MONTHLY' THEN cost * 12
ELSE cost
END)
FROM DATA
WHERE purchaseDate >= *not important*
GROUP BY plan
ORDER BY plan ASC