Autor Zpráva
Jannes
Profil
Dobrý deň, potrebujem poradiť od niekoho kto sa do toho rozumie, lebo ja si stým neviem rady. Mám tabuľku z ktorej v jednom stĺpci robím súčet a v cykle vypíšem podľa mesiaca a roka.
Vygooglil som niečo takéto čo celkom funguje.

SELECT DATE(datum) AS datum, SUM(suma) AS sucet
FROM tabulka
GROUP BY year(datum), month(datum)

Ale ja potrebujem to isté vytiahnuť z troch tabuliek naraz. Súčty zoradené podľa mesiaca a roka osobitne z každej tabuľky. Niečo ako:

SELECT DATE(tabulka1.datum) AS datum1, SUM(suma1) AS sucet1,
DATE(tabulka2.datum) AS datum2, SUM(suma2) AS sucet2,
DATE(tabulka3.datum) AS datum3, SUM(suma3) AS sucet3
FROM tabulka1, tabulka2, tabulka3
GROUP BY Podľa mesiaca a roka

Výsledné súčty zotriedené podľa mesiaca a roka sa budú sčítavať až pri výpise.
Stĺpce sú typu decimal a datetime.
Ďakujem.
juriad
Profil
Jannes:
To zavání špatným návrhem databáze. Pokud jsou data stejné povahy, měla by být v jedné tabulce, ale třeba to není tvůj případ.

Snad by mohlo fungovat toto (opravil jsem „chybu“ s vrácením datumu*):
SELECT t1.rok, t1.mesic, t1.sucet, t2.sucet, t3.sucet
FROM
(
SELECT YEAR(datum) AS rok, MONTH(datum) AS mesic, SUM(suma) AS sucet
FROM tabulka1
GROUP BY YEAR(datum), MONTH(datum)
) AS t1
JOIN
(
SELECT YEAR(datum) AS rok, MONTH(datum) AS mesic, SUM(suma) AS sucet
FROM tabulka2
GROUP BY YEAR(datum), MONTH(datum)
) AS t2
ON t1.rok = t2.rok AND t1.mesic = t2.mesic
JOIN
(
SELECT YEAR(datum) AS rok, MONTH(datum) AS mesic, SUM(suma) AS sucet
FROM tabulka3
GROUP BY YEAR(datum), MONTH(datum)
) AS t3
ON t1.rok = t3.rok AND t1.mesic = t3.mesic

Ale tento dotaz nemusí fungovat v situaci, kdy alespoň v jedné tabulce bude v měsíci chybět záznam.
V takovém případě by bylo nutné buď provést FULL JOIN (v MySQL se musí obcházet UNIONem) nebo předgenerováním seznamu měsíců (inspirace Mysql - select pro data posledniho roku).

Další možné řešení je položení tří nezávislých dotazů do databáze a provedení ve smyčce vždy jednoho fetche z každého výsledku.

* celý datum nesmíš vracet protože ti nikdo negarantuje, který záznam to bude. V MySQL to projde, ale jinde ne. Můžeš si ale vytáhnout třeba:
MIN(DAYOFMONTH(datum)) AS den
Jannes
Profil
Keď neexistuje v danom mesiaci v niektorej tabuľke záznam nevypíše sa riadok ako bolo vyššie uvedené, inak to funguje perfektne. Skúsim sa ešte inšpirovať radami. Ďakujem.
juriad
Profil
Jannes:
Záleží na tom, jak se to má chovat v případě, kdy v nějaké tabulce záznam neexistuje.
Pokud máš jistotu, že v nějaké konkrétní zaznam vždy bude, stačí ji uvést jako první a ostatní připojit LEFT JOINem.
Pokud chceš jen záznamy z měsíců, pro které existuje záznam v alespoň jedné tabulce, šlo by použít:
(SELECT YEAR(datum), MONTH(datum) FROM tabulka1
UNION
SELECT YEAR(datum), MONTH(datum) FROM tabulka2
UNION
SELECT YEAR(datum), MONTH(datum) FROM tabulka3
) AS datumy
jako první virtuální tabulku ve FROM a všechny další připojit pomocí LEFT JOIN.

Pokud chceš záznam i za měsíc pro který neexistuje žádný záznam, musíš jej nějak vygenerovat (viz odkázané vlákno).

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:

0