Autor Zpráva
BunnyBugs
Profil *
Dobrý večer ... člověk se fakt stále učí :) ... mám zase jeden dotaz.

Mám tabulku (MySQL) a v ní sloupce `datum`, `počet`, ...atd.
Výpis všech řádků pomocí cyklu WHILE a řazení dle data, případně dle rozmezí data a celkové součty sloupců SUM() to není problém.
Otázka však spočívá v tom, jak veškerá data vypsat cyklem za jednotlivé měsíce a jejich vypsání? ... mělo by to vypadat asi takhle:

ROK 2013 / součet celkem /
leden / součet /
únor / součet /
atd...

ROK 2014 / Součet celkem /
leden / součet /
únor / součet
atd...

určitě by to šlo podmíněnými dotazy s předvyplněnými názvy měsíců, ale ne v každý měsíc obsahuje záznam(y), takže bych měl zbytečně prázdné řádky a asi i zbytečně moc dotazů.
Lze toto provést nějakým cyklem? Děkuji moc za každé nakopnutí, fakt už si nevím rady.
juriad
Profil
Nejčastější potíže s PHP (FAQ) » Nadpis skupiny nejen při výpisu z databáze
BunnyBugs
Profil *
No, mně ani tak nejde o ty nadpisy, ale o to, aby mi to nevypsalo jednotlivé záznamy daného měsíce, ale jen součty po měsících.
Takže ne toto:

2014
leden / 1.1.2014 / 20
leden / 3.1.2014 / 35
únor / 5.2.2014 / 11
únor / 8.2.2014 / 9 atd....

ale mělo by to vypsat součty do jednoho řádku daného měsíce, tedy nějak takto:
leden / 55
únor / 20 atd...
Alphard
Profil
Na úrovní MySQL použitejte sum(castka) + group by year(datum), month(datum).
Kajman
Profil
V mysql se dají rovnou spočítat i součty za roky...

SELECT *
FROM   (SELECT Year(datum)  rok,
               Month(datum) mesic,
               Sum(pocet)  soucet
        FROM   tabulka
        GROUP  BY Year(datum),
                  Month(datum)
                  WITH ROLLUP) t
WHERE  rok IS NOT NULL
ORDER  BY rok,
          mesic
BunnyBugs
Profil *
Kajman:
Skvělé a funkční řešení, ale protože jsem tohle seskupování ještě nedělal, nevím, jak to vypsat do přesného formátu.
Když to vypíšu takto:

while ($rowquery = mysql_fetch_array($query)) {
        echo '<table>';
        echo '<tr><td>Rok</td><td>'.$rowquery['rok'].'</td><td>'.$rowquery['soucet'].'</td></tr>';
        echo '<tr><td>Měsíc</td><td>'.$rowquery['mesic'].'</td><td>'.$rowquery['soucet'].'</td></tr>';
        echo '</table><br>';
        }

mám to v takovémhle formátu:

Rok / 2013 / 50
Měsíc / nic / 50

Rok / 2013 / 20
Měsíc / 1 / 20

Rok / 2013 / 30
Měsíc / 2 / 30 ...atd

ale já bych to potřeboval vypsat trochu úhledněji a to takto:

Rok / 2013 / 50
Měsíc / 1 / 20
Měsíc / 2 / 30 ...atd

Jak tedy mám takový výpis sestavit? Díky moc za radu.


Tak jsem to vymyslel takto:

echo '<table>';
    while ($rowquery = mysql_fetch_array($query)) {
        if ($rowquery['mesic'] == "") {
            echo '<tr><td colspan="2"><h2>Rok '.$rowquery['rok'].'</h2></td></tr>';
            echo '<tr><th>Celkem</th><th>'.$rowquery['soucet'].'</th></tr>';
            }
            else {
                echo '<tr><td>'.cz_mesic_neskl($rowquery['mesic']).'</td><td>'.$rowquery['soucet'].'</td></tr>';
                }
            
        }
        echo '</table><br>';

Funguje to, jak má, ale je to tak správně?, nebo to lze vypsat něja kulantněji?
Kajman
Profil
Ano, součty za rok mají prázdný měsíc.
BunnyBugs
Profil *
[#5] Kajman
Prosím, mám k tomuto ještě dotaz. Lze toto ještě nějak podmínit, aby mi to vypsalo třeba dva, tři... součty, pomocí WHERE jiného sloupce?
Tzn., že první součet bude třeba podle vedlejšího sloupce, který má třeba číslo 5, dlaší bude součet podle sloupce s číslem 8, apod.
Asi nějak takto:

Rok / 2013 / (sloupec 1) 50 / (sloupec 2) 40 / (sloupec 3) 120 / ...atd
Měsíc / 1 / (sloupec 1) 20 / (sloupec 2) 15 / (sloupec 3) 80 / ...atd
Měsíc / 2 / (sloupec 1) 30 / (sloupec 2) 25 / (sloupec 3) 40 / ...atd

Zkoušel jsem to různě, ale nevím, jak to přesně napsat, pokud to tedy lze.
Můžete mi prosím ještě pomoci? Děkuji moc
Kajman
Profil
BunnyBugs:
Těžko se to z toho popisu chápe. Nejsem si jistý, co chcete, pokud potřebujete součty sloupce pocet rozdělené za rok, měsíc plus např. podle uživatele, tak ten třetí sloupec (např. s idetinfikací uživatele) dáte také do group by. Poskládat data do tabulky o proměnném počtu sloupců ale musíte až v php.

Pokud toužíte po něčem jiném, zkuste nachystat příklad dat a chtěný výsledek.
BunnyBugs
Profil *
No já nevím, jak to mám napsat.
Váš výše uvedený příklad mi vypíše součet daného sloupce v Mysql, tedy např. sloupec `vydaj1` nebo když rozšířím dotaz na další sloupec, třeba `vydaj2`, vypíše mi to i druhý sloupec.
Pokaždé to ale vypíše úplní součet daného sloupce a já bych potřeboval, aby mi to sečetlo a vypsalo jen sumu podle toho, co je uvedeno v dalším sloupci.

Takže asi takto:
SUM(`vydej1`) AS 'soucet1' WHERE `sloupec3` = 'Materiál ', SUM(`vydej1`) WHERE `sloupec3` = 'Zboží', atd....

Samozřejmě jsem to vypsal jednodušeji, ale něco v tomhle smyslu bych potřeboval. Tedy aby se mi nesečetl celý sloupec, ale jen podle podmínky v jiném sloupci.
Nevím, jak to do toho dotazu [#5] Kajman dostat :(


V tom druhém SUM jsem zapomněl napsat ještě AS 'soucet2'
Kajman
Profil
SELECT Year(datum)  rok,
       Month(datum) mesic,
       sloupec3,
       Sum(vydej1)  soucet
FROM   tabulka
GROUP  BY Year(datum),
          Month(datum),
          sloupec3
       WITH ROLLUP
BunnyBugs
Profil *
Kajman:
Tohle mi ale řeší zase jen jeden sloupec, to dle podmínky už fungovalo, ale já potřebuji, aby mi to vypsalo za sebe třeba sloupce tři a každý s jinou podmínkou.
To právě nevím, jak ten dotaz sestavit :(
Prosím kdyžtak o znění celého dotazu, bude-li to možné. Děkuji moc.
Kajman
Profil
Zkoušel jste ten dotaz? Všechna data by tam měla být. Jen nejsou v jednom řádku, to si přeskládejte v php. Podle ...atd to totiž vypadá na proměnný počet sloupců a toho jen v sql nedosáhnete.
BunnyBugs
Profil *
Kdepak, počet sloupců je stálý. Důležité pro tento případ je sloupec `vydaj` a sloupec `typ_platby`, kde `vydaj` je DECIMAL 10,2 (sumy, které se sčítají) a `typ_platby` který je VARCHAR a jsou v něm přednastavené hodnoty výběrem SELECT ve formuláři (Materiál, Zboží, PHM, atd.)

A proto bych chtěl udělat výpis, kde budu mít rozděleny a sečteny sloupce z `typ_platby` něco jako toto:

SELECT * FROM 
                            (SELECT Year(datum) rok, Month(datum) mesic, 
                            Sum(prijmy) soucetprijmy, SUM(vydaje) soucetvydaje FROM tabulka GROUP BY Year(datum), Month(datum) WITH ROLLUP) t
                            WHERE rok IS NOT NULL ORDER BY rok, mesic

Jen s tím rozdílem, že v uvedeném příkladu jsou prijmy a vydaje pevny sloupec, který sčítá od prvního řádku do posledního, ale já bych právě potřeboval, aby mi to sečetlo sumy jen je ty, co v pevně daném sloupci `typ_platby` je uveden třeba 'materiál', ostatní do součtu nezahrnovat. Stejně tak i ostatní příjmy, kde `typ_platby` je 'zboží', 'PHM', atd....


Prostě nevím, jak tam dostat tu podmínku WHERE. Pokud by šlo o výpis jednoho sloupce, tak to funguje takto:

SELECT * FROM (SELECT Year(datum) rok, Month(datum) mesic, 
Sum(prijmy) soucetprijmy FROM tabulka WHERE `typ_platby` = 'Materiál' GROUP BY Year(datum), Month(datum) WITH ROLLUP) t
WHERE rok IS NOT NULL ORDER BY rok, mesi

to je odzkoušené, ale chci-li vypsat více sloupců, které se mi právě sečtou jen pokud je v sloupci `typ_platby` uveden konkrétní údaj, to se mi bohužel nedaří :(

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: