Autor | Zpráva | ||
---|---|---|---|
Jannes Profil |
#1 · Zasláno: 3. 1. 2015, 14:20:02
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 |
#2 · Zasláno: 3. 1. 2015, 14:42:27
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 |
#3 · Zasláno: 3. 1. 2015, 15:43:41
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 |
#4 · Zasláno: 3. 1. 2015, 23:53:53
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 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). |
||
Časová prodleva: 10 let
|
0