Har en tabell som innhåller massa log-data grupperat per dag per "produkt". Nu skulle jag vilja ha ut summan på varje dag mellan två datum även om data saknas vissa dagar.
Om jag väljer 2007-01-03 till 2007-01-06 men det saknas data i tabellen på 2007-01-05 så kommer ju inte den dagen med i resultatet eftersom ingen logning gjordes den dagen på den produkten. Går det direkt i sql-frågan göra så att såna dagar blir med i resultatet men med värdet 0? Eller måste man göra det i programkoden?
SELECT sd.d_mark, SUM(sd.view_count) AS view_count, SUM(sd.bytes) AS bytes
FROM stats_day sd
WHERE d_mark BETWEEN 2007-01-03 AND 2007-01-03
GROUP BY sd.d_mark
Du behöver en hjälptabell med maximalt lika många integervärden som antalet dagar i ditt tidsintervall.
SELECT sd.d_mark,
SUM(coalesce(sd.view_count,0)) AS view_count,
SUM(coalesce(sd.bytes,0)) AS bytes
FROM integers left join stats_day sd
on date '2007-01-02' + cast(integers.v as interval day) = sd.d_mark
WHERE integers.v between 1 and 4
GROUP BY sd.d_mark
Det går att lägga den direkt i frågan,
SELECT sd.d_mark,
SUM(coalesce(sd.view_count,0)) AS view_count,
SUM(coalesce(sd.bytes,0)) AS bytes
FROM ( values (1),(2),(3),(4)) as integers(v)
left join stats_day sd
on date '2007-01-02' + cast(integers.v as interval day) = sd.d_mark
WHERE integers.v between 1 and 4
GROUP BY sd.d_mark
Har försökt med följande fråga, men jag får samma resultat som innan. Har gjort en hjälptabell med en kolumn (i) som innehåller 31 rader, 1-31. Vad gör jag för fel?
SELECT sd.d_mark,
SUM(coalesce(sd.bytes,0)) AS bytes,
SUM(coalesce(sd.view_count,0)) AS view_count
FROM helper_table_integers hti LEFT JOIN stats_day sd
ON date_add('2007-02-01',interval hti.i day) = sd.d_mark
WHERE hti.i BETWEEN 1 AND 28
GROUP BY sd.d_mark
Till slut så fick jag till det. Berodde dels på GROUP BY samt selecten på d_mark.
Fungerande fråga
SELECT date_add('2007-02-01',interval hti.i-1 day) AS d_mark,
SUM(coalesce(sd.bytes,0)) AS bytes,
SUM(coalesce(sd.view_count,0)) AS view_count
FROM helper_table_integers hti LEFT JOIN stats_day sd
ON date_add('2007-02-01',interval hti.i-1 day) = sd.d_mark
WHERE hti.i BETWEEN 1 AND 28
GROUP BY hti.i
376 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849