Autor | Zpráva | ||
---|---|---|---|
jataky Profil |
Zdravím
Jak spočítat rozdíl dvou slupců dvou tabulek přímo přes mysql (sum(n.pocet)-sum(v.mnozstvi))? Je to možné jedním zápisem? tabulky: CREATE TABLE nakup ( id char(5) NOT NULL, datum date, co_id_rozmer char(3) REFERENCES rozmer, pocet char(3) , PRIMARY KEY (id) CREATE TABLE rozmer ( id char(5) NOT NULL, delka varchar(50), PRIMARY KEY (id) ); CREATE TABLE vymena ( id char(5) NOT NULL, datum date, kde_id_nazev_VZT char(3) REFERENCES nazev_VZT, mnozstvi char(3) , rozmer_fil char(3) REFERENCES rozmer, PRIMARY KEY (id) ); Výpis: SELECT r.delka, sum(v.mnozstvi) FROM vymena v, rozmer r WHERE v.rozmer_fil = r.id GROUP BY delka ORDER BY delka desc SELECT r.delka, sum(n.pocet) FROM nakup n, rozmer r WHERE n.co_id_rozmer = r.id GROUP BY delka ORDER BY delka desc |
||
juriad Profil |
#2 · Zasláno: 7. 7. 2013, 12:00:55
Moje oblídené, přidej patro:
SELECT a.delka, a.suma - b.suma AS rozdil FROM (SELECT r.delka, Sum(v.mnozstvi) AS suma FROM vymena v, rozmer r WHERE v.rozmer_fil = r.id GROUP BY delka) AS a JOIN (SELECT r.delka, Sum(n.pocet) AS suma FROM nakup n, rozmer r WHERE n.co_id_rozmer = r.id GROUP BY delka) AS b ON a.delka = b.delka ORDER BY a.delka |
||
jataky Profil |
... a kdybych chtěl, aby mi vypsalo i data, které jsou pouze v jednou selectu?
|
||
juriad Profil |
Tak musíš definovat, co znamená rozdíl hodnoty a ničeho a následně provést vnější spojení.
Pro začátek stačí, když použiješ místo obyčejného JOINu: LEFT JOIN (pokud neexistuje hodnota v druhém dotazu, nahradí ji za NULL), či RIGHT JOIN (pokud neexistuje hodnota v prvním dotazu, nahradí ji za NULL). Databáze obvykle umí i FULL OUTER JOIN, ale bohužel to není případ mysql; tento typ joinu umí doplnit NULL při spojování na obě strany. V mysql je nutné ho emulovat UNIONem. Přiklad: A(id, x): 1 'A' 2 'B' 4 'D' B(id, y): 1 'W' 2 'X' 3 'Y' SELECT * FROM A modifikátor JOIN B ON A.id = B.id výsledek (id, x, y): 1 'A' 'W' # každý join 2 'B' 'X' # každý join 3 NULL 'Y' # right join, full outer join 4 'D' NULL # left join, full outer join Nejkomplexnější dotaz, který bys mohl chtít je: (SELECT a.delka AS delka, a.suma - Ifnull(b.suma, 0) AS rozdil FROM (SELECT r.delka, Sum(v.mnozstvi) AS suma FROM vymena v, rozmer r WHERE v.rozmer_fil = r.id GROUP BY delka) AS a LEFT JOIN (SELECT r.delka, Sum(n.pocet) AS suma FROM nakup n, rozmer r WHERE n.co_id_rozmer = r.id GROUP BY delka) AS b ON a.delka = b.delka) UNION (SELECT b.delka AS delka, Ifnull(a.suma, 0) - b.suma AS rozdil FROM (SELECT r.delka, Sum(v.mnozstvi) AS suma FROM vymena v, rozmer r WHERE v.rozmer_fil = r.id GROUP BY delka) AS a RIGHT JOIN (SELECT r.delka, Sum(n.pocet) AS suma FROM nakup n, rozmer r WHERE n.co_id_rozmer = r.id GROUP BY delka) AS b ON a.delka = b.delka) ORDER BY delka |
||
jataky Profil |
#5 · Zasláno: 7. 7. 2013, 13:53:09
juriad :
Je to super, ale u délky mi vypisuje NULL což je nežádoucí. :-( Rozhodně díky moc za pomoc. |
||
juriad Profil |
#6 · Zasláno: 7. 7. 2013, 13:56:49
jataky:
Na řádku 17 dotazu musí být b.delka (měl jsem tam a.delka). Je to z důvodu RIGHT JOINu, který říká, že existuje záznam v b, ale nemusí existovat v a. |
||
jataky Profil |
#7 · Zasláno: 7. 7. 2013, 14:05:10
juriad:
super to je ono díky moc. |
||
Časová prodleva: 11 let
|
0