[Megoldva]Triviális kérdés - select eredményében adatszámlálás)

Mivel eredendően síkhülye vagyok az sqlhez, de szükséges néha ezt-azt lekérni, segítséget szeretnék kérni. Van általam írt select, ami működik, visszadja a szükséges táblát. E táblában szeretném megszámoltatni, hogy az egyik sorban hányféle adat található. Gondolom a count(distinct adat) -t kellene használnom, de eddig nem sikerült belecsempésznem úgy, hogy szintaktikailag (is) jó legyen.

A select valami ilyesmi:

select u.mezo1, u.mezo2, s.mezo4, k.mezo2 from base1 u join base2 k on u.mezo1=k.mezo2 join base3 s on s.mezo3=k.mezo3 where "feltétel hegyek" :)

A mezo1-t szeretném megszámolni, hogy mennyi féle adat van benne. Szóval valami olyasmi kellene (totál hibás sql szintaxissal), hogy

select count(distinct mezo1) from a fenti select által visszaadott eredmény. Össze kellene fűzni a selecteket valahogyan. Próbálkoztam a select .... in -formával, de ott is elrontok valamit.

Előre is köszi.

Hozzászólások

Ha erre gondoltál, szerencséd van, mert így kell legkevésbé érintened az eredeti kódot:


select count( distinct sql1.szamlalando) from (
   select u.mezo1 as szamlalando,   u.mezo2, s.mezo4, k.mezo2
   from base1 u
   join base2 k on u.mezo1=k.mezo2
   join base3 s on s.mezo3=k.mezo3
   where "feltétel hegyek"
) as sql1 ;

Nem akartam ezért újabb topikot nyitni. Megint lenne egy kis "bajom".
Majdnem hasonló a feladat, annyi különbséggel, hogy ki kellene listázni az összes mezőt. Van egy lista, amiben ügyfelek szerepelnek többször is, és végeredményben egy ügyféllista kellene, amiben mindenki csak egyszer van benne, de látszódik minden adata.

Ebből próbálok kiindulni (thx to lx :) )

select distinct sql1.mezo1 from (
   select u.mezo1,   u.mezo2, s.mezo4, k.mezo2
   from base1 u
   join base2 k on u.mezo1=k.mezo2
   join base3 s on s.mezo3=k.mezo3
   where "feltétel hegyek"
) as sql1 ;

Ezzel az gond, hogy szépen kilistázza az "egyedi" mezo1-ket, de nekem kellene a hozzájuk tartozó mezo2, mezo3 stb.

Gondolom ennek a selectnek az eredményét kellene használnom egy újabb selectben, amiben kilistázom base1-ből azokat a rekordokat, amelynél base1.mezo1 megegyzik az így kapott tábla mezo1-vel, csak már belevesztem a zárójelekbe és a selectekbe :) (és továbbra sem lettem sql guru, mert nem területem).

Vagy teljesen hibás a gondolatmenetem, és nem így kellene megoldani. Előre is köszi!

----
Hülye voltam, megoldva! Korábban a distinct után felsoroltam a kért mezőket, de valamit elronthattam, és ezért indultam el rossz irányba. Szóval probléma megoldva. Bocs az update-ért.

Ne kattints ide!

Ha egy u.mezo1-hez több u.mezo2, s.mezo4, k.mezo2 is tartozik akkor nem lehet értelmesen megcsinálni -> adattisztitás kellene- :) vagy újra gondolni az adatszerkezetet. :)
Persze gányolni mindig lehet pl.:

select u.mezo1
, min(u.mezo2) talan1
, min(s.mezo4) talan2
, min(k.mezo2) talna3
,count(1) variaciok_szama
from base1 u
join base2 k on u.mezo1=k.mezo2
join base3 s on s.mezo3=k.mezo3
where "feltétel hegyek"
group by u.mezo1

ahol a variaciok_szama>1 ott azért óvatosan az adatokkal. :)

Ha pedig a base1 tábla egy nem redundáns vevőtörzs, akkor azt mellé lehet join-olni, vagy where feltételben használni a query kimenetét.

where subquery


select *
from base1
where mezo1 in (
  select u.mezo1
  from base1 u
  join base2 k on u.mezo1=k.mezo2
  join base3 s on s.mezo3=k.mezo3
  where "feltétel hegyek"
) as x

join-osan:


select x.*
from base1 as x
inner join (
  select u.mezo1
  from base1 u
  join base2 k on u.mezo1=k.mezo2
  join base3 s on s.mezo3=k.mezo3
  where "feltétel hegyek"
) as y on x.mezo1=y.mezo1

Adatbáziskergetőtől függ, hogy melyiket szereti jobban, simán lehet a két ekvivalens megoldás között több nagyságrend különbség is futási időben.

Ezzel nem is vitatkoznék :)
Próbáltam egyértelműen leírni, hogy ez csak egy vevőtörzs tábla esetén működik, ha az nem redundás (első mondatom: "Ha pedig a base1 tábla egy nem redundáns vevőtörzs, akkor ...").

Ugyanis hősőnk ilyet írt:


   select u.mezo1,   u.mezo2, s.mezo4, k.mezo2
   from base1 u
   ...

Ezzel az gond, hogy szépen kilistázza az "egyedi" mezo1-ket, de nekem kellene a hozzájuk tartozó mezo2, mezo3 stb.

Én pedig azt feltételeztem, hogy az általa említett "mezo2, mezo3 stb." a base1 tábla tartalma, legalábbis, az u.mezo2 alapján. A k.mezo2 fel sem tűnt.

Mondjuk én vagyok a fasz, hogy ilyen specifikálatlan feladathoz adott obfuscated query-re egyáltalán ránézek, mert én fasz segíteni akarok. Pedig a normális válasz az lenne, hogy felejtsd el ezt a rejtegetést és írd le szépen, hogy mi is az amiben segítségre van szükséged. Ha meg annyira szupertitkos, akkor titoktartási nyilatkozat aláírása után tudok segíteni, nyilván számlásan...

Mint írtam, a probléma megoldódott, az én hibám folytán (elgépelés). Ezért utána már nem olvastam ujra végig a kérdésem, elég volt visszakreálnom a topikot, mert én a címet és a kezdő hsz-t is módosítottam, majd miután pár perc múlva rájöttem, hogy én voltam hülye, visszacsináltam mindent. (ez lehet, hogy nem volt szerencsés) Így nem is tűnt fel (most hogy szóba került a k.mezo2 stb.), hogy az eredeti kérdésre lx által adott megoldásából (copy/paste) szerkesztettem az új kérdést, ami hiba volt, mert természetesen csak az u. mezőire voltam kíváncsi. Bocsánat, ha ezzel megvezettem valakit.

Talán jobb lett volna, ha az új hozzászólást teljesen törlöm...

Ne kattints ide!

A félreértés nem a ködösítésből eredt, hanem elgépelési plusz copy+paste hibából. Mivel az aliasok az eredeti lekérdezésemben is egy karakteresek (ráadásul ugyanazok, mint itt), tehát minimális különség lett volna, csak annyi, hogy a k.mezo2 helyett k.ufazon szerepelt volna, base2 helyett meg ufkarton, stb. Ezzel ugyanúgy megvezettem volna bárkit. :)

A "feltétel hegyek" a probléma szempontjából lényegtelenek voltak. Lásd fent, ha pontosan beidézem, akkor is elgépelem az elejét.

Ne kattints ide!