Apologies in advance for the pictures. I did these up as tables in Stack and they displayed fine in Preview but would not display properly once published.
I have a sample dataset like below with many more KPIs.
The dataset currently returned is just a join of these 2 tables and returns date instead of Date ID, like below: Query
WITH ExampleQuery AS ( SELECT KPI, Value, Date FROM Date LEFT JOIN KPI ON Date.DateID = KPI.DateID ) SELECT KPI, SUM(Value), Date FROM ExampleQuery GROUP BY Date, KPI
I need the dataset to return like below (notice the additional record for KPI B on the 02-01-2022
I can achieve this by below query, but it is very time consuming considering there are a large number of KPIs I need to do this for. Would greatly appreciate any assistance in how I can get this to work somewhat dynamically
WITH ExampleQuery AS ( SELECT CASE WHEN KPI = 'A' THEN Value ELSE 0 END AS ValueA, CASE WHEN KPI = 'B' THEN Value ELSE 0 END AS ValueB, Date, KPI FROM Date LEFT JOIN KPI ON Date.DateID = KPI.DateID ) SELECT KPI, ValueA, Date FROM ExampleQuery WHERE KPI = 'A' UNION ALL SELECT KPI, ValueB, Date FROM ExampleQuery WHERE KPI = 'B'
Any assistance would be very much appreciated before I spend the next day re-writing the query with hard-coded CASE statements
Advertisement
Answer
You want one result per date and KPI type. So cross join the two and then outer join your data.
select date.date, type.kpi, coalesce(sum(kpi.value), 0) as total from date cross join (select distinct kpi from kpi) type left join kpi on kpi.dateid = date.dateid and kpi.kpi = type.kpi group by date.date, type.kpi order by date.date, type.kpi;