Du uppnår vanligtvis denna typ av saker genom att JOIN-ing med en värdetabell , dvs en tabell som innehåller alla värden du är intresserad av.
Typiska värdetabeller kan till exempel innehålla alla heltalsvärden mellan 0 och 1 000, eller alla datum för en given period. Ofta innehåller värdetabellerna fler värden än önskat, och vi får den exakta utdata som önskas genom att lägga till filter i WHERE-satsen.
I det här fallet kommer du att behöva en sådan tabell som innehåller datum. Förutsatt att den här tabellen heter ValTableDates och att den innehåller alla datum mellan januari 2005 och december 2010, skulle frågan se ut så här:
SELECT AVG(data) AS data, VT.ValDate
FROM ValTableDates VT
LEFT JOIN table T ON T.dateReg = VT.ValDate
WHERE VT.ValDate > [Some Start Date] and VT < [Some End Date]
GROUP BY YEAR(dateReg), MONTH(dateReg), DAY(dateReg)
ORDER BY dateReg
Ovanstående fråga kan kräva lite justeringar för att få ett värde noll istället för NULL, men huvudpoängen är att värdetabellen vanligtvis är det enklaste sättet att tillhandahålla utdataposter för saknade datapunkter.
Ett alternativ är att använda en funktion/uttryck som producerar den önskade [datum]-sekvensen, i en underfråga, men detta är i allmänhet mindre effektivt och mer felbenäget.