Autor Zpráva
Eclipse
Profil *
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
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
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  
Přidáš ke každému měsíci jeden záznam a následně jedničku odečteš; ale elegantní to není.
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
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 *
Moc dekuji za odpovedi. Nakonec jsem to vyresil v PHP.
Děkuji juriad za upozorneni pri razeni vypisu... ;)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: