Diskuze: COUNT() s podmienkou
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
to je ale divný sql dotaz Do select klauzuly by si mal dávať iba stĺpce, ktoré máš v klauzuly group by, alebo výsledky agregačných funkcií. Niektoré DBMS to umožňujú aj tak, ale výsledok podľa mňa nemusí byť očakávaný.
Stále ale nechápem čo má byť výsledok, lebo podľa mňa Jano, ktorý je muž a je z Košíc nemá žiadnu súvislosť s tým, že muži sú dvaja a žena jedna. Tým pádom by si podľa mňa mohol spraviť dve nezávislé dotazy. A keď to potrebuješ nalepené (čo ako vravím nechápem prečo) tak to spraviť v PHP. Takto vlastne tie dve stĺpce Muži a Ženy, ktorých hodnoty sa v každom riadku len opakujú sťahuješ zbytočne redundantne.
@Michal
O tom hovorím. Nikde to číslo nie je uložené. Musí sa napočítať...
preto potrebujem v tomto selecte count... ale countovať iba ženy a potom
countovať iba mužov. Najlepšie to asi bude zrobiť v druhom selecte... ten
prvý si dám do temporarky
To je opravdu trošku divný dotaz Čeho přesně potřebuješ docílit? Ten počet mužů a žen má být celkový, nebo z daného města?
A co používáš za databázi?
Zkus se podívát na klauzule "OVER" a "PARTITION BY". Pokud to tvoje databáze podporuje, mohlo by ti to ušetřit práci. Ale stejně by se to asi chtělo zamyslet na požadovaným výsledkem.
Databáza je MS SQL. Potrebujem popočítať, koľko mám v resulte mužov a koľko žien. To je všetko. Nič iné nepotrebujem... ako inak to mám docieliť keď nie tak, že pribudnú ďalšie dva stlpce ku každému row-u?
Toto nie je problém z bežnej praxe, ale teoretické skúšanie (resp. učenie sa) microsoft servera a jeho možnosti. Preto to nemôžem urobiť cez PHP, ani iný jazyk, ale musí to byť v tom SQL a preto by bolo dobre, keby sa to podarilo takto
Pokud se tedy bavíme o teoretické rovině a o tom že se chceš naučit pracovat s MS SQL serverem (což je chvályhodné) neodpustím si jednu teoretickou úvahu, abych popsal proč mi nepříjde tvůj způsob součtu ophlaví nejvhodnější i když samozřejmě to nějak vyřešit jde (ale z mého pohledu ne moc pěkně).
U SQL obecně je dobré dbát na to, aby byl dotaz co nejuniverzálnější, proto z principu nebývá většinou moc dobré, aby počet sloupců byl závislý na počtu položek v číselníku. Číselníkem mám na mysli seznma pohlaví. Určitě se najde někdo, kdo řekne tady nenastane problém, protože jsou zde pohlaví jenom dvě ale:
Jde ale o to, že pokud rozšíříš číselník, budeš muset přidat do výstupu nový sloupec, což v principu není dobře.
V tomto případě by mi přišlo čístší, kdybys neměl pro každé pohlaví samostatný sloupec, ale kdyby na konci byl jenom jeden sloupec "počet" a tam by se ti zobrazil počet lidí z daného pohlaví (podle toho jakého pohlaví by byl člověk na daném řádku).
Jinak to čeho chceš dosáhnout jde udělat např. takhle:
select meno, pohlavie,mesto,
(SELECT COUNT(*) FROM ludia WHERE pohlavie = 'Muž') AS muzi,
(SELECT COUNT(*) FROM ludia WHERE pohlavie = 'Žena') AS zeny
from ludia
Ale to že to jde neznamená že bys to takhle měl dělat. A proč to je špatně vysvětluju ve svém předchozím příspěvku.
Tady ještě přidávám řešení o kterém jsem mluvil ve svém příspěvku a které mi příjde čistší, protože se nemění počet sloupců v závislosti na číselníku:
SELECT meno, pohlavie,mesto, COUNT(pohlavie) OVER(PARTITION BY pohlavie) AS pocet
FROM ludia
Ďakujem za help... tým subselectom som to mal pôvodne vyriešené aj ja, ale nezdalo sa mi to ako best practise (obzvlášť zato, že v skutočnosti mám priklad s cca 10 joinovanými tabuľkami, 10 WHERE podmienkami a pod... a písať takéto dva subselecty to je frajerina... vtedy je to asi lepšie dať do temporarky?)
Příjde na to. Pokud už bych něco takového chtěl psát, tak bych si asi udělal proměnnou typu TABLE (nikoli temporare table) a udělal bych subselect až tam. Ale stálo by za to mrknout se i na exekuční plán, protože je možné že to optimalizér vezme a interně si to kvůli výkonu přelouskne podobně, jako kdyby jsi to sám přepsal pomocí té proměnné nebo temporary table.
Ale jak jsem psal dříve, snažil bych se takovýmto věcem vyhnout. Pokud bych chtěl seznam z nějakého číselníku a k tomu počty jednotlivých položek, asi bych si to napsal jako samostatný dotaz a pracoval bych s tím až na straně aplikace. Ne vždy je nutné (a dobré) vracet SQL dotazem úplně hotový výsledek i když pro výukové učely, proč ne
Popř. vůbec nepotřebuješ tabulku ale stačí ti dvě proměnné:
DECLARE @pocetMuzi INT = (SELECT COUNT(*) FROM ludia WHERE pohlavie= 'muž')
DECLARE @pocetZeny INT= (SELECT COUNT(*) FROM ludia WHERE pohlavie= 'žena')
SELECT meno, pohlavie,mesto, @pocetMuzi as Muzi, @pocetZeny AS Zeny
FROM ludia
osobne bych to rozdelil na dva dotazy (selecty)..
jeden by vracel vebrane osoby
a druhy by vracel pocet muzu a zen
myslim si ze system by se nijak nezpomalil dvemi dotazy s porovnani s jednim dotazem s vnorenymi selecty
Zobrazeno 15 zpráv z 15.