sql >> Databáze >  >> RDS >> Mysql

Vyberte všechny měsíce v daném časovém období, včetně těch s 0 hodnotami

Souhlasím s Lievenovou odpovědí, vytvořte tabulku obsahující všechny měsíce, které byste kdy mohli potřebovat, a použijte ji k "LEVÉMU PŘIPOJENÍ" k vaší výsledkové tabulce. Pamatujte, že toto je opravdu malá tabulka, pouze 365 (ish) řádků za rok dat, která máte... A můžete snadno napsat nějaký kód, který tuto tabulku naplní zpočátku

Děláme to zde a přináší to spoustu výhod, například si představte měsíční datovou tabulku s následujícími poli (a dalšími, která vás napadnou!) plně vyplněná pro všechny měsíce v daném rozsahu;

  • Datum (např. 2009-04-01)
  • Den (např. 1)
  • Den v týdnu (např. středa)
  • Měsíc (např. 4)
  • Rok (např. 2009)
  • Finanční rok (např. 2009/10)
  • Finanční čtvrtletí (např. 1. čtvrtletí 2009)
  • Kalendářní čtvrtletí (např. 2. čtvrtletí 2009)

Poté to zkombinujte s výše uvedeným dotazem, a to následovně;

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`

V mém kódu SQL mohou být nějaké chyby, protože jsem nebyl schopen vytvořit testovací tabulky, ale doufejme, že získáte hlavní a upravíte jej tak, aby vyhovoval vašim potřebám!

Pomocí tohoto můžete změnit svou klauzuli „GROUP BY“ na cokoli, co máte v tabulce „dateTable“, což vám umožní snadno vykazovat podle finančního čtvrtletí, měsíce, dne, dne v týdnu atd.

Doufám, že to pomůže!



  1. Vysvětlení operátora Oracle INTERSECT

  2. Nelze vyřešit konflikt řazení mezi SQL_Latin1_General_CP1_CI_AS a Latin1_General_CI_AS v operaci rovná se

  3. Poškození databáze

  4. Jak vytvořit databázi zásob v Accessu