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
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  
Tento dotaz ale bude počítat jen rozdíly pro délky, které jsou ve výsledcích obou selectů.
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
juriad :

Je to super, ale u délky mi vypisuje NULL což je nežádoucí. :-(

Rozhodně díky moc za pomoc.
juriad
Profil
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
juriad:
super to je ono díky moc.

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: