Autor | Zpráva | ||
---|---|---|---|
Eclipse Profil * |
#1 · Zasláno: 27. 5. 2014, 18:10:24
Dobrý den,
snažím se posčítat záznamy v tabulce tak, aby se vypsalo: mesic celkem 1 23 2 0 3 12 Vytvořil jsem tuto konstrukci: SELECT MONTH(`datum`) AS mesic, COUNT(*) as celkem FROM clanky WHERE YEAR(`datum`)=2014 GROUP BY MONTH(`datum`) Problém je, že pokud v daném měsíci není vložen žádný záznam, výpis jej ignoruje. Výsledkem tedy je: mesic celkem 1 23 3 12 Bez února. Nevíte prosím jak dotaz upravit, aby vypisoval i nulové výsledky? Předem děkuji |
||
Taps Profil |
#2 · Zasláno: 27. 5. 2014, 18:18:42
Eclipse:
řešením by mohlo být použití left join nebo subselectu, viz http://explainextended.com/2010/01/30/aggregates-subqueries-vs-group-by/ |
||
juriad Profil |
#3 · Zasláno: 27. 5. 2014, 18:37:39
To s tou nulou nepůjde nijak rozumně jednoduše. Proč by se databáze měla domnívat, že existuje měsíc s číslem 2.
Z pohledu databáze je to stejné, jako bys chtěl ve výpisu řádek opice 0 .
Můžeš zkusit třeba následující: SELECT mesic, COUNT(*) - 1 FROM (SELECT MONTH(datum) AS mesic FROM clanky WHERE YEAR(datum) = 2014 UNION ALL SELECT 1 AS mesic UNION ALL SELECT 2 AS mesic UNION ALL SELECT 3 AS mesic UNION ALL SELECT 4 AS mesic UNION ALL SELECT 5 AS mesic UNION ALL SELECT 6 AS mesic UNION ALL SELECT 7 AS mesic UNION ALL SELECT 8 AS mesic UNION ALL SELECT 9 AS mesic UNION ALL SELECT 10 AS mesic UNION ALL SELECT 11 AS mesic UNION ALL SELECT 12 AS mesic) t GROUP BY mesic ORDER BY mesic Mimochodem, asi chceš výsledek seřadit podle měsíce (to, že to vrací ve správném pořádí bez řazení je jen náhoda a může se to kdykoli změnit). |
||
Kcko Profil |
Šlo by to ještě nějak takto
select sum(case when mesic=1 then total else 0 end) as 'leden', sum(case when mesic=2 then total else 0 end) as 'únor', sum(case when mesic=3 then total else 0 end) as 'březen', sum(case when mesic=4 then total else 0 end) as 'duben', sum(case when mesic=5 then total else 0 end) as 'květen', sum(case when mesic=6 then total else 0 end) as 'červen', sum(case when mesic=7 then total else 0 end) as 'červenec', sum(case when mesic=8 then total else 0 end) as 'srpen', sum(case when mesic=9 then total else 0 end) as 'září', sum(case when mesic=10 then total else 0 end) as 'říjen', sum(case when mesic=11 then total else 0 end) as 'listopad', sum(case when mesic=12 then total else 0 end) as 'prosinec' from ( select month(datum) as mesic, count(*) as total from clanky group by month(datum) WHERE year(datum) = 2014 ) as tmp group by rok Ale domnívám se, že Juriadovo řešení bude rychlejší. |
||
Kajman Profil |
#5 · Zasláno: 27. 5. 2014, 21:16:37
Dalším řešením je přidání chybějících měsíců až např. v php. Nebo si můžete udělat kalendářovou tabulku a tu využít v dotaze.
|
||
Eclipse Profil * |
#6 · Zasláno: 28. 5. 2014, 21:15:40
Moc dekuji za odpovedi. Nakonec jsem to vyresil v PHP.
Děkuji juriad za upozorneni pri razeni vypisu... ;) |
||
Časová prodleva: 10 let
|
0