sql >> Database >  >> RDS >> Mysql

Selecteer alle maanden binnen een bepaalde periode, inclusief die met 0 waarden

Ik ben het eens met het antwoord van Lieven, maak een tabel met alle maanden die je ooit nodig zou kunnen hebben, en gebruik die om "LEFT JOIN" naar je resultatentabel te gaan. Onthoud dat dit een heel kleine tabel is, slechts 365 (ish) rijen per jaar aan gegevens die je hebt... En je kunt gemakkelijk wat code schrijven om deze tabel in eerste instantie te vullen

We doen dit hier, en het biedt veel voordelen, stel je bijvoorbeeld een maandelijkse gegevenstabel voor met de volgende velden (en alle andere die je maar kunt bedenken!) volledig gevuld voor alle maanden in een bepaald bereik;

  • Datum (bijv. 01-04-2009)
  • Dag (bijv. 1)
  • Dag van de week (bijv. woensdag)
  • Maand (bijv. 4)
  • Jaar (bijv. 2009)
  • Boekjaar (bijv. 2009/10)
  • Financiële kwartaal (bijv. 2009Q1)
  • Kalenderkwartaal (bijv. 2009Q2)

Combineer dit dan als volgt met uw vraag hierboven;

SELECT `DT`.`myYear`, `DT`.`myMonth`, 
           AVG(`myTable`.`value1`) as avg_value_1, 
           AVG(`myTable`.`value2`) as avg_value_2

FROM `dateTable` as DT
LEFT JOIN `myTable`
    ON `dateTable`.`myDate` = `myTable`.`save_date`

WHERE `dateTable`.`myDate` BETWEEN '2009-01-01' AND '2009-07-01'

GROUP BY `DT`.`myYear`, `DT`.`myMonth`

Er kunnen enkele fouten in mijn SQL-code zitten omdat ik de testtabellen niet heb kunnen maken, maar hopelijk krijgt u de hoofdsom en wijzigt u deze om aan uw behoeften te voldoen!

Hiermee kunt u uw "GROUP BY"-clausule wijzigen in wat u ook in de "dateTable"-tabel heeft, waardoor u gemakkelijk kunt rapporteren per financieel kwartaal, maand, dag, dag van de week, enz.

Ik hoop dat dat helpt!



  1. Een opgeslagen procedure maken in SQL Server 2017

  2. Een Python-dictaat gebruiken voor een SQL INSERT-instructie

  3. SQL:ontleden de voor-, middelste en achternaam uit een veld met volledige naam

  4. Hoe kan ik mijn standaarddatabase in SQL Server wijzigen zonder MS SQL Server Management Studio te gebruiken?