Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL]Totalen op 1 rij van verschillende condities

Pagina: 1
Acties:

  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
Ik heb een tabel advertenties. Een advertentie kan twee verschillende statussen hebben (status = 1 of status = 2).
Graag wil ik de totalen van de statussen op 1 regel in plaats van 2 regels.

In het laatste geval is het simpel
code:
1
SELECT count(*) FROM advertisements GROUP BY status


Dan krijg ik dus twee regels terug. Maar ik wil weten of ik het ook in 1 regel kan terugkrijgen.
Zoiets als dit (pseudo-idee)
code:
1
SELECT cuont(status=1), count(status=2) FROM advertisements


Dit kan wel vrij makkelijk via een subquery volgens mij, maar vraag me af of dit de makkelijkste manier is. Want een subquery komt de leesbaarheid niet ten goede

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
SQL:
1
2
3
4
select sum(case when status=1 then 1 else 0 end) as status_een, 
       sum(case when status=2 then 1 else 0 end) as status_twee 
from mytable
...


Waarom wil je 't per-se in 1 record terughebben? Dit gaat nooit beter performen dan je eerste optie...

[ Voor 25% gewijzigd door RobIII op 30-10-2012 12:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • van.der.schulting
  • Registratie: Juli 2002
  • Laatst online: 09-08-2024
Daar gaat het me niet om... voor de rest van het algoritme is het net even wat handiger om alles in 1 record te hebben ipv 2. Maar dat is een hele andere discussie die ik hier verder niet wil gaan voeren (das offtopic en ik kom daar zelf wel uit ;))

Thanks in ieder geval voor de tip, nu kom ik er verder wel uit ;)

[ Voor 12% gewijzigd door van.der.schulting op 30-10-2012 13:20 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat is natuurlijk wel relevant, want je kunt het later alsnog makkelijk ombouwen naar het juiste formaat.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 11:27

JaQ

En wat als je een nieuwe status krijgt? (de logica schaalt niet).

Een query met pivot zouwellicht beter zijn en performt absoluut beter dan de draak van RobIII (nofi)

Egoist: A person of low taste, more interested in themselves than in me


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
JaQ schreef op dinsdag 30 oktober 2012 @ 23:01:
En wat als je een nieuwe status krijgt? (de logica schaalt niet).
Dat is precies waarom ik aangaf dat je dit helemaal niet in 1 resultaat wil hebben.
JaQ schreef op dinsdag 30 oktober 2012 @ 23:01:
Een query met pivot zouwellicht beter zijn en performt absoluut beter dan de draak van RobIII (nofi)
Ware het niet dat TS niet heeft aangegeven over welk RDBMS het gaat en, AFAIK en correct me if I'm wrong, pivot in MySQL (=gokje (of educated guess op basis van eerdere topics), maar gaat voor de meeste RDBMS'en op) is ook geen schoonheid ;) Voor een beperkt aantal records (lees: geen miljoenen) en een beperkt aantal statussen moet dit prima werken (en durf ik zelfs te vermoeden dat 't nog wel eens kon concurreren met een pivot; maar dat zou ik moeten profilen, immers: meten = weten :P ). Maar ik zie graag jouw suggestie (en liefst een die op elk RDBMS werkt of makkelijk te vertalen is naar elk RDBMS :P ).

[ Voor 17% gewijzigd door RobIII op 30-10-2012 23:15 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 23-11 22:50

The Eagle

I wear my sunglasses at night

JaQ gaat me waarschijnlijk de mantel uitvegen om dit voorbeeld, maar het kan ook met inline views:
SQL:
1
2
3
4
select 
(SELECT count(*) FROM advertisements where status=1) as EEN,
(SELECT count(*) FROM advertisements where status=2) as TWEE 
from advertisements;

Dat zou ook 1 regel met twee waarden terug moeten geven :)
Maar mooi is het niet idd :X

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 10:31
The Eagle schreef op dinsdag 30 oktober 2012 @ 23:10:
JaQ gaat me waarschijnlijk de mantel uitvegen om dit voorbeeld, maar het kan ook met inline views:
SQL:
1
2
3
4
select 
(SELECT count(*) FROM advertisements where status=1) as EEN,
(SELECT count(*) FROM advertisements where status=2) as TWEE 
from advertisements;

Dat zou ook 1 regel met twee waarden terug moeten geven :)
Maar mooi is het niet idd :X
Die "from" op regel 4 is dan ook niet nodig hoor.



Overigens, is het niet mogelijk om een COUNT() met een GROUP BY te doen (voor de oplossing van een count per status).

SQL:
1
2
3
SELECT status, COUNT(1) AS CountOfStatus
FROM advertisements
GROUP BY status


EDIT: stond al in de TS, niet goed gelezen blijkbaar.

[ Voor 121% gewijzigd door Styxxy op 31-10-2012 01:00 ]


  • RobertMe
  • Registratie: Maart 2009
  • Laatst online: 11:20
The Eagle schreef op dinsdag 30 oktober 2012 @ 23:10:
JaQ gaat me waarschijnlijk de mantel uitvegen om dit voorbeeld, maar het kan ook met inline views:
SQL:
1
2
3
4
select 
(SELECT count(*) FROM advertisements where status=1) as EEN,
(SELECT count(*) FROM advertisements where status=2) as TWEE 
from advertisements;

Dat zou ook 1 regel met twee waarden terug moeten geven :)
Maar mooi is het niet idd :X
Als alternatief zou die ook met count maar zonder subqueries kunnen.

Untested:
[code=sql]
SELECT
COUNT(CASE WHEN status = 1 THEN 1 ELSE NULL END CASE) AS een,
COUNT(CASE WHEN status = 2 THEN 1 ELSE NULL END CASE) AS twee
FROM advertisements
[/code=sql]

Normaliter telt count() een NULL niet mee, en daar kun je hier dus misbruik van maken. Idee is voor de rest hetzelfde als de oplossing van RobIII

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 11:27

JaQ

RobIII schreef op dinsdag 30 oktober 2012 @ 23:08:
Ware het niet dat TS niet heeft aangegeven over welk RDBMS het gaat en, AFAIK en correct me if I'm wrong, pivot in MySQL (=gokje (of educated guess op basis van eerdere topics), maar gaat voor de meeste RDBMS'en op) is ook geen schoonheid ;) Voor een beperkt aantal records (lees: geen miljoenen) en een beperkt aantal statussen moet dit prima werken (en durf ik zelfs te vermoeden dat 't nog wel eens kon concurreren met een pivot; maar dat zou ik moeten profilen, immers: meten = weten :P ). Maar ik zie graag jouw suggestie (en liefst een die op elk RDBMS werkt of makkelijk te vertalen is naar elk RDBMS :P ).
Ik wilde je niet uitvoeteren, maar ik denk dat de TS een veelgemaakte foute keuze maakt (bij een datadriven applicatie de selecties aanpassen op de presentatie ipv op de data).

Deze query kan imho niet zonder ranzigheid. Zonder inzicht in de dataverdeling (het aantal rijen per status) en het al dan niet aanwezig zijn van een index op de kolom "status" kan ik in geen geval zeggen welke oplossing "het beste" zou zijn voor de database.

Jouw oplossing lijkt wel beter dan die van The Eagle (maar ik ga The Eagle de mantel niet uitvegen :) ). De reden hiervoor is dat jouw oplossing 1 full table scan doet, waar die van The Eagle dat potentieel meerdere malen doet.

Maar toch is de beste oplossing voor de TS om de logica in zijn code aan te passen ipv een kromme query uit te willen voeren.

Egoist: A person of low taste, more interested in themselves than in me

Pagina: 1