Reputation: 1174
I have managed to aggregate by time one value giving a query result like this:
SELECT date(takenat) AS takendate,
hour(takenat) AS HourTaken,
avg(reading) AS ch1av
FROM readings
WHERE channelid = 4
GROUP BY takendate, HourTaken
ORDER BY takenat, HourTaken
Some sample output:
takendate HourTaken ch1av
2013-01-01 0 105.5082
2013-01-01 1 107.2167
2013-01-01 2 106.4833
2013-01-01 3 107.0333
However, I wish to have results (in the same query) for multiple channelid's
takedate HourTaken ch1av ch2av ch4av
So, for example hourly averages for channelid=1,2 and 4
I had a go with sub queries but my sql foo just aint enough!
Upvotes: 0
Views: 100
Reputation: 6315
It sound that you want something like this:
SELECT DATE(takenat) AS takendate,
HOUR(takenat) AS HourTaken,
AVG(CASE WHEN channelid = 1 THEN reading ELSE null END) AS ch1av,
AVG(CASE WHEN channelid = 2 THEN reading ELSE null END) AS ch2av,
AVG(CASE WHEN channelid = 4 THEN reading ELSE null END) AS ch4av
FROM readings
WHERE channelid IN (1,2,4)
GROUP BY takendate, HourTaken
ORDER BY takenat, HourTaken
Upvotes: 1
Reputation: 263813
use IN
if you have multiple conditions,
select date(takenat) AS takendate,
hour(takenat) AS HourTaken,
avg(reading) AS ch1av,
channelid
from readings
where channelid IN (1,2,4)
group by takendate, HourTaken, channelid
order by takenat, HourTaken
this is the same as using OR
select date(takenat) AS takendate,
hour(takenat) AS HourTaken,
avg(reading) AS ch1av,
channelid
from readings
where channelid = 1 OR
channelid = 2 OR
channelid = 4
group by takendate, HourTaken, channelid
order by takenat, HourTaken
Upvotes: 2