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.
- 3029 megtekintés
Hozzászólások
group by
t
- A hozzászóláshoz be kell jelentkezni
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 ;
- A hozzászóláshoz be kell jelentkezni
Ezer köszönet, ez tökéletes!! (sőt még a logikája is világos)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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. :)
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Csak a vita kedvéért:
Egyik sem adja vissza a base2, base3 mezőit ebben formában:)
Ha a base[23] duplikációt okoz a joinban a második megoldás duplikálni fogja a sorokat az eredményben.
Üdv.
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
Akkor jól értettem félre és a query-k elvileg jók.
- A hozzászóláshoz be kell jelentkezni
Tipp: legkozelebb azert ne obfuszkald el ennyire a kodot.
--
Blog | @hron84
Üzemeltető macik
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni