[SQL] rijen als kolommen bij COUNT

Pagina: 1
Acties:
  • 125 views sinds 30-01-2008
  • Reageer

  • Giblet
  • Registratie: December 2001
  • Laatst online: 07-05 09:21
Allereerst mijn excuses als de titel wat verwarrend overkomt, maar ik vind het nogal moeilijk om de juiste benaming voor het probleem te kiezen. Ik heb de search al doorgespit en google kon mij ook geen resultaat bieden (waarschijnlijk ook vanwege de benaming).

Ik heb de volgende query gemaakt:
code:
1
2
3
SELECT     COUNT(status) AS Expr1
FROM         stickeraanvragen
GROUP BY status

Hier komen bij mij 3 rijen uit (er zijn 3 verschillende statussen mogelijk) met elk hun aantal erachter. Dit zijn ook daadwerkelijk de resultaten die ik nodig heb, echter zou ik ze graag in 1 rij willen hebben. Is dit mogelijk? Of is er anders een workaround mogelijk (m.b.v. views bijvoorbeeld)? Ik werk met MS SQL 2000 server.

  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Wil je er dus 3 kolommen van maken? Dan zul je een pivottable moeten maken...

stp - PSN ID: stp_4


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:11
Waarom wil je ze in één rij hebben ?
SQL is er om data te manipuleren en op te halen; niet om ze te presenteren.
Als jij dat in 3 kolommen wilt tonen, dan zal uw client-programma daar verantwoordelijk moeten voor zijn

https://fgheysels.github.io/


  • Giblet
  • Registratie: December 2001
  • Laatst online: 07-05 09:21
whoami schreef op woensdag 27 april 2005 @ 12:27:
Waarom wil je ze in één rij hebben ?
SQL is er om data te manipuleren en op te halen; niet om ze te presenteren.
Als jij dat in 3 kolommen wilt tonen, dan zal uw client-programma daar verantwoordelijk moeten voor zijn
Omdat er uiteindelijk meerdere rijen moeten komen waar die drie resultaten ook onderdeel van zijn.
dus het zal iets worden als
code:
1
2
3
4
5
vestiging     in afwachting     afgekeurd     afgehandeld
----------------------------------------------------------------------
alkmaar       5                     7                   1
zaandam     4                     8                   9
beverwijk     2                     1                   4

En ik heb geen idee hoe je dit zou moeten gaan opmaken in VB.NET

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

3 queries:
SQL:
1
2
3
4
select vestiging, count(status)
from table
where status = InAfwachting
group by vestiging;

En even voor iedere kolom herhalen.

Het kan ook in 1 query maar da's echt megapointless en stukje minder performant :+

[ Voor 6% gewijzigd door curry684 op 27-04-2005 12:40 ]

Professionele website nodig?


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
Zoek ff in MS SQL in de help naar pivottable (Cross-Tab Reports).

[ Voor 19% gewijzigd door stp_4 op 27-04-2005 12:43 ]

stp - PSN ID: stp_4


  • Giblet
  • Registratie: December 2001
  • Laatst online: 07-05 09:21
Ik denk dat het dan toch inderdaad maar de drie losse statussen ophalen wordt omdat ik geen tijd heb om me in de pivot tables te verdiepen (denk ik).

Ik had alleen gedacht/gehoopt dat het relatief makkelijk zou kunnen. In ieder geval bedankt voor de snelle response!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Ach geen tijd voor pivot tables is wat overdreven, tis gewoon een kwestie van een moeilijke query schrijven voor iets simpels ;) Maja tis een keuze wat je ermee wil :)

Professionele website nodig?


  • stp_4
  • Registratie: Maart 2003
  • Laatst online: 30-04 19:47
curry684 schreef op woensdag 27 april 2005 @ 13:03:
Ach geen tijd voor pivot tables is wat overdreven, tis gewoon een kwestie van een moeilijke query schrijven voor iets simpels ;) Maja tis een keuze wat je ermee wil :)
Moeilijke querie? Maak een temptable en vul deze simpel met de waardes die je nodig hebt. Daarna een simpele select op deze temptable en klaar is kees ;)

stp - PSN ID: stp_4


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 04-05 14:55

Janoz

Moderator Devschuur®

!litemod

Dat is inderdaad een 'meoilijke query'. In principe ben je bezig presentatie in je dataaccess te proppen. Een simpele query waarbij je grouped en ordered op status en vesteging kan heel simpel in je presentatie software worden omgezet in getoond tabelletje.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Giblet
  • Registratie: December 2001
  • Laatst online: 07-05 09:21
Ik heb toch nog even geprobeerd me te verdiepen in pivot-tables en ik krijg het niet voor elkaar. Volgens mij geeft ie problemen omdat ik met strings werk voor de statussen en geen integers of decimals :s

[ Voor 6% gewijzigd door Giblet op 27-04-2005 15:44 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:11
* whoami is het gewoon eens met Janoz

https://fgheysels.github.io/


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

andere mogelijkheid :

SQL:
1
2
3
4
5
6
7
8
select 
 vestiging,
 sum( iif( status='status1' ; 1 ; 0 )) as status1,
 sum( iif( status='status2' ; 1 ; 0 )) as status2,
 sum( iif( status='status3' ; 1 ; 0 )) as status3,
 sum( iif( status='status4' ; 1 ; 0 )) as status4,
from tabel
group by vestiging


Dit wordt (werd) veel gebruikt in oracle, gezien je daar geen pivot hebt (had vroeger)

  • Giblet
  • Registratie: December 2001
  • Laatst online: 07-05 09:21
D4Skunk schreef op donderdag 28 april 2005 @ 09:59:
andere mogelijkheid :

SQL:
1
2
3
4
5
6
7
8
select 
 vestiging,
 sum( iif( status='status1' ; 1 ; 0 )) as status1,
 sum( iif( status='status2' ; 1 ; 0 )) as status2,
 sum( iif( status='status3' ; 1 ; 0 )) as status3,
 sum( iif( status='status4' ; 1 ; 0 )) as status4,
from tabel
group by vestiging


Dit wordt (werd) veel gebruikt in oracle, gezien je daar geen pivot hebt (had vroeger)
Dan geeft ie bij het eerste '= teken' al een error

  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

kan je de query eens posten die je hiervoor gebruikt hebt ?

  • Ecto2002
  • Registratie: Juni 2002
  • Laatst online: 07-05 16:22
Het hoeft niet zo moeilijk te zijn, gewoon een aantal subqueries gebruiken is al voldoende :

code:
1
2
3
4
SELECT A.Expr1 AS Status1, B.Expr1 AS Status2, C.Expr1 AS Status3 FROM
(SELECT COUNT(status) AS Expr1 FROM stickeraanvragen WHERE status = 1 GROUP BY status) A CROSS JOIN
(SELECT COUNT(status) AS Expr1 FROM stickeraanvragen WHERE status = 2 GROUP BY status) B CROSS JOIN
(SELECT COUNT(status) AS Expr1 FROM stickeraanvragen WHERE status = 3 GROUP BY status) C


Zou nog vrij performant moeten zijn ook :)

  • Giblet
  • Registratie: December 2001
  • Laatst online: 07-05 09:21
Ecto2002 schreef op donderdag 28 april 2005 @ 11:55:
Het hoeft niet zo moeilijk te zijn, gewoon een aantal subqueries gebruiken is al voldoende :

code:
1
2
3
4
SELECT A.Expr1 AS Status1, B.Expr1 AS Status2, C.Expr1 AS Status3 FROM
(SELECT COUNT(status) AS Expr1 FROM stickeraanvragen WHERE status = 1 GROUP BY status) A CROSS JOIN
(SELECT COUNT(status) AS Expr1 FROM stickeraanvragen WHERE status = 2 GROUP BY status) B CROSS JOIN
(SELECT COUNT(status) AS Expr1 FROM stickeraanvragen WHERE status = 3 GROUP BY status) C


Zou nog vrij performant moeten zijn ook :)
Dat is bijna precies wat ik zoek!! Alleen dit zijn de resultaten van alle vestigingen bij elkaar... Kan iemand toevallig ook vertellen hoe ik dit dan weer kan onderverdeling per vestiging?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Ecto2002 schreef op donderdag 28 april 2005 @ 11:55:
Het hoeft niet zo moeilijk te zijn, gewoon een aantal subqueries gebruiken is al voldoende :

Zou nog vrij performant moeten zijn ook :)
CROSS JOIN en performant? Ik wil de execution plan van deze query wel eens zien maar het lijkt me sterk dat ie dit echt lekker weg krijgt ;) Het is dan ook de query die ik bedoelde met:
curry684 schreef op woensdag 27 april 2005 @ 12:37:
Het kan ook in 1 query maar da's echt megapointless en stukje minder performant :+
:Y)

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Laatst online: 09:11
Mensen kunnen toch moeilijk en complex doen.....

Gewoon een query die alles ophaalt, en in de presentatie-layer alles mooi formatteren zoals je het wilt.
Eenvoudig, snel, onderhoudbaar, etc....

maarja.....

[ Voor 4% gewijzigd door whoami op 28-04-2005 12:53 ]

https://fgheysels.github.io/


Verwijderd

curry684 schreef op donderdag 28 april 2005 @ 12:50:
[...]CROSS JOIN en performant? Ik wil de execution plan van deze query wel eens zien maar het lijkt me sterk dat ie dit echt lekker weg krijgt ;) Het is dan ook de query die ik bedoelde met:[...] :Y)
Dat hoeft niet echt slecht voor de performance te zijn mits je de where clause van de sub-queries laat refereren aan de sleutel van de hoofd-query. Ik weet alleen niet of sql*server dat aan kan, Oracle in ieder geval wel.

In oracle zou ik het echter altijd zo oplossen (net als D4Skunk al verteld) :
code:
1
2
3
4
5
6
select   vestiging
,        sum(decode(status,'status1',1, 0)) status1
,        sum(decode(status,'status2',1, 0)) status2
,        sum(decode(status,'status3',1, 0)) status3
from     tabel
group by vestiging

[ Voor 20% gewijzigd door Verwijderd op 28-04-2005 13:14 ]


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Verwijderd schreef op donderdag 28 april 2005 @ 13:06:
[...]


In oracle zou ik het echter altijd zo oplossen (net als D4Skunk al verteld) :
code:
1
2
3
4
5
6
select   vestiging
,        sum(decode(status,'status1',1, 0)) status1
,        sum(decode(status,'status2',1, 0)) status2
,        sum(decode(status,'status3',1, 0)) status3
from     tabel
group by vestiging
:*)

  • Giblet
  • Registratie: December 2001
  • Laatst online: 07-05 09:21
whoami schreef op donderdag 28 april 2005 @ 12:53:
Mensen kunnen toch moeilijk en complex doen.....

Gewoon een query die alles ophaalt, en in de presentatie-layer alles mooi formatteren zoals je het wilt.
Eenvoudig, snel, onderhoudbaar, etc....

maarja.....
In theorie heb je gelijk. Echter heb ik ook geprobeerd om het in de presentatie-layer te formatteren en dat is me helaas ook niet gleukt. En aangezien de opdrachtgever snel resultaat wil zien (en later pas tijd vrij wil maken voor het optimaliseren) heb ik liever een wat zwaardere query dan dat ik een tijd bezig ben met het juist formatteren...

Het is dus kiezen tussen kwaden op dit moment :/
In oracle zou ik het echter altijd zo oplossen (net als D4Skunk al verteld) :
code:
1
2
3
4
5
6
select   vestiging
,        sum(decode(status,'status1',1, 0)) status1
,        sum(decode(status,'status2',1, 0)) status2
,        sum(decode(status,'status3',1, 0)) status3
from     tabel
group by vestiging
Fantastisch! Dit werkt! Alleen moet je in MS SQL CASE gebruiken ipv decode... Voor de volledigheid hier de code zoals ie uiteindelijk geworden is:
code:
1
2
3
4
SELECT     vestiging, SUM(CASE WHEN status = 'in afwachting' THEN 1 ELSE 0 END) status1, SUM(CASE WHEN status = 'afgekeurd' THEN 1 ELSE 0 END) 
                      status2, SUM(CASE WHEN status = 'afgehandeld' THEN 1 ELSE 0 END) status3
FROM         stickeraanvragen
GROUP BY vestiging


Merci!!!

[ Voor 36% gewijzigd door Giblet op 28-04-2005 13:47 ]

Pagina: 1