Avatar
Mego
Člen
Avatar
Mego:

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. července 10:31
Radšej 15 minút skôr, ako 15 sekúnd neskoro...
Avatar
mayo505
Redaktor
Avatar
mayo505:

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. července 10:56
Avatar
Odpovídá na Mego
Michal Štěpánek:
  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. července 11:54
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Mego
Člen
Avatar
Mego:

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. července 11:55
Radšej 15 minút skôr, ako 15 sekúnd neskoro...
Avatar
Mego
Člen
Avatar
Odpovídá na Michal Štěpánek
Mego:

@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. července 11:56
Radšej 15 minút skôr, ako 15 sekúnd neskoro...
Avatar
Honza
Člen
Avatar
Odpovídá na Mego
Honza:

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. července 11:56
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Mego
Honza:

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. července 11:58
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Mego
Člen
Avatar
Mego:

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. července 12:01
Radšej 15 minút skôr, ako 15 sekúnd neskoro...
Avatar
Honza
Člen
Avatar
Odpovídá na Mego
Honza:

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. července 12:24
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Mego
Honza:

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. července 12:28
Nahoru Odpovědět 22. července 12:28
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Honza:

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. července 12:44
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Mego
Člen
Avatar
Mego:

Ď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. července 13:20
Radšej 15 minút skôr, ako 15 sekúnd neskoro...
Avatar
Honza
Člen
Avatar
Odpovídá na Mego
Honza:

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. července 13:32
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza
Člen
Avatar
Odpovídá na Mego
Honza:

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. července 13:38
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Lukáš Černý :

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. července 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.