Autor | Zpráva | ||
---|---|---|---|
hondziiikh Profil |
#1 · Zasláno: 21. 9. 2015, 11:34:14
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' 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' 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 |
#3 · Zasláno: 21. 9. 2015, 11:58:11
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 |
#4 · Zasláno: 21. 9. 2015, 13:20:00
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 |
#5 · Zasláno: 22. 9. 2015, 09:12:48
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 |
#6 · Zasláno: 22. 9. 2015, 09:16:28
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' ) |
||
abc Profil |
Kajman:
Jen bych opravil Coleasce na Coalesce
|
||
Kajman Profil |
#9 · Zasláno: 22. 9. 2015, 20:33:17
abc:
Dīk, opraveno. |
||
Časová prodleva: 9 let
|
0