sql >> Databasteknik >  >> RDS >> Mysql

returnerar nollor för datum som inte finns MYSQL GROUP BY

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.




  1. korrekt vilolägeskommentar för byte[]

  2. Hur exporterar man analyserad data från Python till en Oracle-tabell i SQL Developer?

  3. sök i databasen baserat på värdet som valts från databasen

  4. Skillnad mellan count(1) och count(*) i orakel