Autor Zpráva
hondziiikh
Profil
Zdravím, na první pohled se jevilo jako banalita, ale jsem v koncích :)
Mám tabulku 'allZaznamy' kde je stav "v řešení" a "vyřešeno" a další stavy.
Potřebuji zjistit jedním dotazem kolik je vyřešeno a kolik v řešení

Výsledek mi docela dobře zpracuje union:
(SELECT count(id) AS vReseni FROM allZaznamy WHERE YEAR(date) = 2015 AND MONTH(date) = 1 AND stav='V řešení') 
UNION 
(SELECT count(id) AS vyreseno FROM allZaznamy WHERE YEAR(date) = 2015 AND MONTH(date) = 1 AND stav='Vyřešeno'
Jen to dává jako dva výsledky sloupce vReseni.

Join mi zase vrací buď nulu, nebo 384183 :)
SELECT count(a1.id) AS vReseni, count(a2.id) AS vyreseno FROM allZaznamy a1 
JOIN 
allZaznamy a2 ON a1.id!=a2.id WHERE a1.stav='V řešení' AND a2.stav='Vyřešeno'
Vím proč, protože id ani jedné se neshodují, to je jasné. Ale bez join nevím jak to udělat, a bez ON prostě JOIN nefunguje :)

Nějaké návrhy prosím? Moc díky
Taps
Profil
hondziiikh:
nešlo by to takto?
SELECT count(id) AS Pocet,stav FROM allZaznamy WHERE YEAR(date) = 2015 AND MONTH(date) = 1 AND stav in ('V řešení', 'Vyřešeno') GROUP BY stav
hondziiikh
Profil
Taps:
Ahoj, šlo, a takto to i řeším, mezi tím, než se zde vyřeší tento můj dotaz... Cíl byl, mít hlavičku a jeden řádek - takto:

vReseni| vyreseno
252    | 110

Pokud není řešitelné nevadí. Ale leží mi to v hlavě :)
juriad
Profil
hondziiikh:
Je lepší to mít tak, jak to vrací [#2], protože je to konzistentní s uložením dat v tabulce. V horizntální dimenzi jsou vždy sloupce tabulky nebo jejich transformace, nikoli data.

Šlo by to třeba takto:
SELECT * FROM
(SELECT count(id) AS vReseni FROM allZaznamy WHERE YEAR(date) = 2015 AND MONTH(date) = 1 AND stav = 'V řešení') x
CROSS JOIN
(SELECT count(id) AS vyreseno FROM allZaznamy WHERE YEAR(date) = 2015 AND MONTH(date) = 1 AND stav = 'Vyřešeno') y
hondziiikh
Profil
juriad:
1. souhlasím, nechám si poradit od profíků. Pro kód takto tedy nechám, tohle chci ale určite použít pro view v DB
2. ANO! Funguje to, přesně podle představ :) moc děkuji
3. Cross join? O cross join jsem jeste ani neslysel sakra :)

Mnohokrát všem děkuji za rady. Spokojenost.
juriad
Profil
hondziiikh:
CROSS JOIN je to samé jako JOIN jen explicitně říkáš, že chceš propojit všechny řádky nalevo se všemi napravo a jelikož je výstupem na každé straně jen jeden, ve výsledku bude také jeden. Tady jsem to použil, aby bylo jasné, že za tím spojením není žádná hluboká myšlenka a že skutečně klauzule ON je neuvedená záměrně.

In MySQL, JOIN, CROSS JOIN, and INNER JOIN are syntactic equivalents (they can replace each other). In standard SQL, they are not equivalent. INNER JOIN is used with an ON clause, CROSS JOIN is used otherwise.
dev.mysql.com/doc/refman/5.0/en/join.html
Kajman
Profil
Další možnost např. takto...
SELECT Coalesce(Sum(stav = 'V řešení'), 0) vreseni,
       Coalesce(Sum(stav = 'Vyřešeno'), 0) vyreseno
FROM   allzaznamy
WHERE  date >= '2015-01-01'
       AND date < '2015-02-01'
#      AND stav IN ( 'V řešení', 'Vyřešeno' ) 
U zakomentované podmínky si nejsem jistý, zda bude dotaz rychlejší s ní nebo bez ní. Bude záležet na datech a indexech.
abc
Profil
Kajman:
Jen bych opravil Coleasce na Coalesce
Kajman
Profil
abc:
Dīk, opraveno.

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: