IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: COUNT() s podmienkou

Aktivity
Avatar
Lava
Člen
Avatar
Lava:22.7.2016 10:31

Ahojte... dajme tomu, že mám select, ktorý mi vyberie nejaké stĺpce. A ja ich teraz potrebujem pocountovať v tomto selecte za určitej podmienky. Neviem to lepšie opísať, ako príkladom :)

Jano Muž Košice
Barbora Žena Kežmarok
Mišo Muž Prešov

A ja do tohto selectu potrebujem pridať súčty mužov a žien, teda

Meno Pohlavie Mesto Muži Ženy
Jano Muž Košice 2 1
Barbora Žena Kežmarok 2 1
Mišo Muž Prešov 2 1

Čiže query by malov yzerať nejako takto

SELECT meno, pohlavie, mesto, COUNT(?) as muzi, COUNT(?) as zeny
 FROM ludia WHERE 1
GROUP BY pohlavie

Čo mám doplniť namiest otáznikov, aby som to dokázal narátať osve pre mužov a osve pre ženy? Alebo sa to takto nedá vôbec?

Odpovědět
22.7.2016 10:31
Aspartám, sacharín, to je môj vitamín
Avatar
mayo505
Tvůrce
Avatar
mayo505:22.7.2016 10:56

to je ale divný sql dotaz :D 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.

 
Nahoru Odpovědět
22.7.2016 10:56
Avatar
Odpovídá na Lava
Michal Štěpánek:22.7.2016 11:54
  1. Podle mě nelze míchat v jednom dotazu select hodnoty sloupce a součet řádků
  2. Co má být ta podmínka "WHERE 1"?
  3. kde jsou uloženy ty počty mužů a žen, resp. kde by se mělo to výsledné číslo vzít?
Nahoru Odpovědět
22.7.2016 11:54
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Lava
Člen
Avatar
Lava:22.7.2016 11:55

Toto s PHP nemá nič spoločné, nakoľko riešim čisto databázu. Ale o tom rozdelení selectov do dvoch musím pouvažovať, zrejme je správne to urobiť.

Nahoru Odpovědět
22.7.2016 11:55
Aspartám, sacharín, to je môj vitamín
Avatar
Lava
Člen
Avatar
Odpovídá na Michal Štěpánek
Lava:22.7.2016 11:56

@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

Nahoru Odpovědět
22.7.2016 11:56
Aspartám, sacharín, to je môj vitamín
Avatar
Honza
Člen
Avatar
Odpovídá na Lava
Honza:22.7.2016 11:56

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?

Nahoru Odpovědět
22.7.2016 11:56
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Lava
Honza:22.7.2016 11:58

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.

Nahoru Odpovědět
22.7.2016 11:58
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Lava
Člen
Avatar
Lava:22.7.2016 12:01

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

Nahoru Odpovědět
22.7.2016 12:01
Aspartám, sacharín, to je môj vitamín
Avatar
Honza
Člen
Avatar
Odpovídá na Lava
Honza:22.7.2016 12:24

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:

  • za prvé je dobré se dotazy naučit psát tak, aby se daly aplikovat v obecnějších scénářích
  • za druhé např. u různých seznamek bývá číselník pohlaví větší (gay, lesba atd.), to že to tam asi nepatří je druhá věc

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).

Nahoru Odpovědět
22.7.2016 12:24
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Lava
Honza:22.7.2016 12:28

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.

Editováno 22.7.2016 12:28
Nahoru Odpovědět
22.7.2016 12:28
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Honza:22.7.2016 12:44

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
Nahoru Odpovědět
22.7.2016 12:44
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Lava
Člen
Avatar
Lava:22.7.2016 13:20

Ď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?)

Nahoru Odpovědět
22.7.2016 13:20
Aspartám, sacharín, to je môj vitamín
Avatar
Honza
Člen
Avatar
Odpovídá na Lava
Honza:22.7.2016 13:32

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 :)

Nahoru Odpovědět
22.7.2016 13:32
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Lava
Honza:22.7.2016 13:38

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
Nahoru Odpovědět
22.7.2016 13:38
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Lukáš Černý :26.7.2016 22:44

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

 
Nahoru Odpovědět
26.7.2016 22:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.