Sziasztok!
Csináltam egy ilyen lekérdezést egy könyvelési program adatbázisára Postgresql alatt:
SELECT
tszem.mutato,
tszem.szemszam,
tszem.nev,
tszem.ir_szam,
thely.helyseg,
tszem.ut,
konyv.kk,
konyv.tetjel_k,
konyv.adonem_k,
konyv.szla_tip,
konyv.marad
FROM
public.tszem,
public.thely,
public.konyv
WHERE
tszem.mutato = konyv.k_kulcsn AND
thely.ir_szam = tszem.ir_szam AND
konyv.m_datum <= '2009-12-31';
tszem: személyes adatok
thely: település
konyv: könyvelési adatok
A konyv.marad numerikus, azt kellene sum függvénnyel összesíteni, a tszem.mutato alapján kéne group by. Ha viszont a select alatt a sum(konyv.marad)-ot adok meg, akkor a GROUP BY klausa alatt kéri az összes nem sum-os mezőt, a konyv.m_datum mivel egyedi, így majdnem ugyanazt adja vissza, mint GROUP BY nélkül. Biztos, valami subselect kéne, csak nem vágom, hogy mire. konyv.m_datum amúgy DATE. Valakinek volna valamilyen ötlete?
A tszem.mutato egyedi, konyv.k_kulcshoz kapcsolódik, az a konyv táblában többször is megjelenik.
- 1679 megtekintés
Hozzászólások
A többi mezőt hagyd ki a selectből.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
De amúgy meg kellene. Olyan 10 000 rekord a konyv tábla, valószínűleg tudnám excelben is kezelni, csak SQL-el elegánsabb lenne.
- A hozzászóláshoz be kell jelentkezni
-törölve
- A hozzászóláshoz be kell jelentkezni
Hogy érted, hogy az is kellene?
Tisztázzuk, vegyük a következő adatokat:
X Y Z
--------
1 A 10
1 B 20
2 C 40
Tegyük fel, hogy az X oszlop szerint akarsz csoportosítani, ami azt jelenti, hogy össze akarod vonni az azonos X-szel rendelkező sorokat. Tehát lesz két csoportod. Az első csoportban lesz 1/A/10 és 1/B/20, a másik csoportban lesz 2/C/30.
Kérdés, hogy lesznek a csoportokból sorok? A csoportosított oszlopok értékei csoporton belül azonosak, tehát egy csoporton belül az X oszlop értéke mindenütt ugyanaz, ez egyértelmű. Az első csoportban X=1, a másikban X=2.
Tegyük fel továbbá, hogy a Z oszlopra aggregálni akarsz, például a SUM függvénnyel. Ez is egyszerű, csoporton belül sok sorból egy sor lesz. Az első csoportban SUM(Z)=10+20=30. A második csoportban SUM(Z)=40.
És mi legyen Y-nal? Nem is csoportosítunk rá, nem is aggregálunk rá, tehát egy csoporton belül többféle értéket vehet fel. Nézzük meg, hol tartunk:
X (group) Y (???) Z (sum)
-----------------------------
1 A és B 30
2 C 40
Így már látszik, hogy az Y-nal bizony valamit kezdeni kellene. Ha simán elhagyod, problem solved. Ha pedig kell az értéke, akkor gondolj bele, hogy mit szeretnél látni? Többféle értéket szeretnél egy cellában?
Lentebb javasoltak olyan megoldást, ami aggregál csoportonként, de nem vonja össze a sorokat. Magyarul azokat a cellákat, amik csoportosítás esetén össze lennének vonva, azokat megismétli:
X Y Z (sum)
-------------
1 A 30
1 B 30
2 C 40
Amint látod, az aggregált cella meg van ismételve két helyen. Nem állítom, hogy nincs értelme, mert lehet, csak ritkán.
- A hozzászóláshoz be kell jelentkezni
Excelizmus.
Olykor mellékhatás, gyakran elvárás a kimeneti redundancia - mert a döntéshozó (sejted, mikor hoz döntést) mindent szeretne mindenhol látni (csak férjen el egy képernyőn, és legyenek jó nagyok a karakterek).
- A hozzászóláshoz be kell jelentkezni
Oké oké, csak rávezettetek. A dátum miatt volt több sorom a kelleténél, persze gondolhattam volna, ha szűrök rá attól még nem muszáj megjeleníteni.
- A hozzászóláshoz be kell jelentkezni
+1
- A hozzászóláshoz be kell jelentkezni
Sajnos több, mint 15 éve a pg felé sem néztem - de valószínűleg eszi ezt, mert nincs benne nagy modernkedés.
SELECT
tszem.mutato,
(
select sum(konyv.marad)
from public.konyv as k
where k.k_kulcs = tsz.mutato
) as szumma,
tszem.szemszam,
tszem.nev,
tszem.ir_szam,
thely.helyseg,
tszem.ut,
konyv.kk,
konyv.tetjel_k,
konyv.adonem_k,
konyv.szla_tip,
konyv.marad
FROM
public.tszem as tsz,
public.thely,
public.konyv
WHERE
tszem.mutato = konyv.k_kulcsn AND
thely.ir_szam = tszem.ir_szam AND
konyv.m_datum < = '2009-12-31';
- A hozzászóláshoz be kell jelentkezni
" így majdnem ugyanazt adja vissza, mint GROUP BY nélkül"
De pont ez a lényeg, ezért kell az összeset felsorolni, hogy ne "majdnem" kapd meg az eredményt, mert ha csoportosítasz a tszem.mutato alapján, de valahol máshol meg mégis van eltérő adat, akkor mit csináljon? Adjon vissza 2 azonos tszem.mutato-t tartalmazó rekordot, vagy egyesítse az eltérő értékeket? És ha egyesítené, mégis hogyan?
Egyébként meg mi a baj azzal, hogy fel kell sorolni az összeset? Nem lehet SMS-ben elküldeni a parancsot, vagy mégis miért?
- A hozzászóláshoz be kell jelentkezni
Igazad van, konyvelés dátumra szűrhetek anélkül is, hogy megjelenítem.
- A hozzászóláshoz be kell jelentkezni