Fórumok
Van egy lekérdezésünk, ami összeszámolja adott kliens esetén, hogy melyik státuszban hányszor volt. Így néz ki:
SELECT client_id,status,COUNT(status) FROM cli_s GROUP BY status,client_id ORDER BY client_id,status;
Ez ad egy ilyen táblázatot:
+-----------+--------+---------------+ | client_id | status | count(status) | +-----------+--------+---------------+ | 155 | 0 | 69 | | 155 | 10 | 8 | | 155 | 30 | 2 | | 155 | 40 | 2 | | 1100 | 0 | 158 | | 1100 | 10 | 17 | | 1100 | 30 | 16 | +-----------+--------+---------------+
Ez helyett szeretnék valami tömörebbet, valahogy így:
+-----------+----------+-----------+-----------+-----------+-----------+ | client_id | count(0) | count(10) | count(20) | count(30) | count(40) | +-----------+----------+-----------+-----------+-----------+-----------+ | 155 | 69 | 8 | 0 | 2 | 2 | | 1100 | 158 | 17 | 0 | 16 | 0 | +-----------+----------+-----------+-----------+-----------+-----------+
Ok, awk-val pillanatok alatt össze lehet dobni az átalakítást, de talán az SQL is tud ilyet.
A status csak a 0,10,20,30,40 számok valamelyike lehet.
Hozzászólások
Egyrészt a mező értékei is lehetnek subqueryk, pl.
Másik opció, hogy a subqueryd beteszed egy CTE-be (vagy külön egy temp táblába, ha rengeteg az adat) és azt joinolgatod össze.
Lehet, hogy Window functionnal is lehetne valamit trükközni, de most este van, hogy megnézzem.
Fejből írtam, PostgreSQL-re, escapelést majd átírod a neked megfelelőre. Első nem feltétlen lesz gyors, de ha nem kell sok adatra, jó lehet. Ha sok adatra kell, akkor inkább a második vagy akár temp tábla + index rá.
Egyéb megjegyzések, 15+ év tapasztalata alapján: remélem nem ezek a mezőnevek vannak a rendes rendszerben, mert elég meh. Mi az a cli_s? s valami rövidítés? cli az client vagy command line? stb. Hogy a következő ember ne tudja, hogy mi az? A status meg szintén szerintem nem szerencsés, hogy nincs ott, hogy miféle status (ha majd lesz 50 status meződ a rendszerben, öröm lesz queryt írni és mindig aliaszolni) és egyébként se annyira jó szerintem az, hogy egy integer value a status, ahelyett, hogy egy enum lenne vagy legalább varcharban rendes szöveg. Csináltam én is ilyet, Ameddig nem trilliócsilliárd rekord van és nem ez a szűk keresztmetszet, csak önszopatás.
Ezt többféleképp is csinálhatod:
pl. a legegyszerűbb, hogy ha csak client_id-re group-olsz, és a count(statusz) helyett ezt írod:
sum(case status when 0 then 1 else 0 end) as status0,
sum(case status when 10 then 1 else 0 end) as status10,
stb...
(A count(statusz)-t is benne hagynám esetleg ellenőrzésnek, és kivenném, ha rendben van minden.)
Össze is join-olhatsz 5 lekérdezést, ami mindegyik a megfelelő státuszra szűr, és count-al számol,
De a mai adatbázis kezelőkben tuti van rá valami modern okosság, amiket nem tudok fejből, pl pivot, crosstab funkciók.
sub
Szvsz sorból oszlopot csinálni pont az a felhasználás, amire az SQL nem való. Hacsak a felhasználó nem direktben futtatja a select-et, akkor van valamilyen kliens oldali programnyelv, amiben ezt meg lehet csinálni.
Tulajdonképp csak egy fapados report lenne. Kb.: echo "select ..." | mysql --table dbname | mail -s "report" xxx@yyy.hu
már miért nem? erre van a pivot több sqlben is
~ubuntu, raspbian, os x~
A 'több SQL-ben is' az pont ugyanaz, mint amit én mondtam: utólag rácsavarozott, koncepcióidegen feature gyártóspecifikus bővítményekkel.
Milyen adatbázisról beszélünk? Mert van ahol ez egyszerűen megoldott, pl. plsql pivot.
mysql
Ez valószínűleg minden ANSI SQL-en működni fog.
Ez pedig ugyan az errefelé közutálatnak örvendő cég által gyártott rdbms-ben (11g-től).
Szerintem az Oraclet alapvetően nem a featuresetje miatt szokták utálni :)
Nem csak azért :)
BlackY
"Gyakran hasznos ugyanis, ha számlálni tudjuk, hányszor futott le már egy végtelenciklus." (haroldking)
Köszi. Kicsit át kellet írni, de ez az ötlet vált be.
Sőt, még az IF is kispórolható:
Igen, ez ugyanaz, mint a case when-es.
Ezt javaslom mindenkinek, hogy nézze meg:
https://www.slideshare.net/MarkusWinand/modern-sql
Van benne pár érdekes dolog, pedig ez sem mai prezentáció. (Vagy legalábbis nekem volt.)
Ami most kellett, azt úgy látom, a 72-es, 73-as slide-on szerepel is.