I have the following data,
x
Id Value Tag
1 200 C
1 300 D
1 100 D
2 300 D
2 100 D
I want to sum up values of tags and deduct sum of D’s from sum of C’s. The below works fine if both tags are present for an id.
SELECT
D.sumOfD - C.sumOfC as value,
FROM (
SELECT IFNULL(ROUND(SUM(value),2),0) as 'sumOfD',Id
FROM Reports exp WHERE exp.tag = 'D'
) as D
JOIN (
SELECT IFNULL(ROUND(SUM(value),2),0) as 'sumOfC' ,Id
FROM Reports exp WHERE exp.tag = 'C'
) as C ON C.Id = D.Id
;
But if a tag is not available for an id either one of the subqueries will not return a value. In the above sample data there is only tag D for id 2 so the on C.Id = D.Id
condition is failing. In this case i want zero to be returned.
Expected result
Id Value
1 200 (300+100-200)
2 400 (300+100-0) -- where 0 is the sum of values for tag C for id 2 which is zero
How can i do this? I am using mysql 8.0.17
Advertisement
Answer
Try the below – using conditional aggregation
select id,
sum(case when Tag='D' then value else 0 end)-sum(case when Tag='C' then value else 0 end) as diff
from tablename
group by id