[MS SQL] reporting over 1 kolom

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • sjunnie
  • Registratie: September 2001
  • Laatst online: 19-09 19:02

sjunnie

U mag ook Sjun zeggen

Topicstarter
Ik weet niet hoe ik de topictitel beter moet formuleren, so here goes:

Ik moet een rapportage maken over hoe vaak een aantal records voorkomt in een tabel waar:
  • een positie gelijk is aan 4 of 5
  • een positie gelijk is aan 6
  • een positie iedere willekeurige waarde heeft behalve 6
Dit heb ik nu:
SQL:
1
2
3
4
5
6
SELECT naam, count(*)as "aantal 1"
  FROM brontabel where EVENTDATE between '20090617' and '20090619'
and position in ('4','5')
--and position = '6'
--and position <> '6'
group by naam


Met als volgende (voorbeeld) resultaat:

eventsaantal 1
120
29
31
431


Nu wil ik die twee commentaarregels ook somehow verwerkt hebben (in dezelfde query?) om te komen tot onderstaand gewenst resultaat:
eventsaantal 1aantal 2aantal 3
120242
29121
31210
431251


ehm... help? :*)

If you can judge a wise man by the color of his skin then mister you're a better man than I


Acties:
  • 0 Henk 'm!

  • Acid__Burn
  • Registratie: Maart 2007
  • Laatst online: 19-09 20:16
En waar komen die andere 2 kolommen vandaan?

Acties:
  • 0 Henk 'm!

  • sjunnie
  • Registratie: September 2001
  • Laatst online: 19-09 19:02

sjunnie

U mag ook Sjun zeggen

Topicstarter
Acid__Burn schreef op donderdag 18 juni 2009 @ 14:29:
[...]


En waar komen die andere 2 kolommen vandaan?
Die stellen dus het aantal rijen voor waarin een cel een bepaalde waarde heeft. ((4 of 5), 6 of <>6)

Waarschijnlijk kun je dit heel eenvoudig oplossen door het probleem compleet anders te tackelen, maar ik kom er zo ff niet op.

If you can judge a wise man by the color of his skin then mister you're a better man than I


Acties:
  • 0 Henk 'm!

  • freak-ish
  • Registratie: December 2008
  • Laatst online: 15-01 17:16
onderstaande code is geen MySQL maar DB2 :o , maar ik zou het in deze richting zoeken.

tweede optie:
code:
1
2
3
4
5
6
7
8
SELECT 
naam,
sum(case when position in ('4','5')  then 1 else 0 end) as "aantal 1",
sum(case when position  = '6'  then 1 else 0  end) as "aantal 2",
sum(case when position  position <> '6'   1 else 0  naam end) as "aantal 2" 
  FROM brontabel where EVENTDATE between '20090617' and '20090619' 
group by
naam


reden edit: Optie 2 is beter dan optie 1 8)

[ Voor 69% gewijzigd door freak-ish op 18-06-2009 15:37 ]


Acties:
  • 0 Henk 'm!

  • Acid__Burn
  • Registratie: Maart 2007
  • Laatst online: 19-09 20:16
sjunnie schreef op donderdag 18 juni 2009 @ 14:39:
[...]

Die stellen dus het aantal rijen voor waarin een cel een bepaalde waarde heeft. ((4 of 5), 6 of <>6)

Waarschijnlijk kun je dit heel eenvoudig oplossen door het probleem compleet anders te tackelen, maar ik kom er zo ff niet op.
Als je ID meeneemt in de select, zul je nooit een goede count kunnen maken. Maar probeer anders een iets met subselect:

SQL:
1
2
3
4
5
select *
from table
where id in
(select id
from table 2)


of


SQL:
1
2
3
4
select *
from
(select id
from table 2) TT

Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Ik ga mee met het voorstel van freak-ish (afgezien van het dubbele alias "aantal 2")

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • RobertMe
  • Registratie: Maart 2009
  • Nu online
Ik ga niet mee met het voorstel van freak-ish, maar maak er een afgeleide van :+
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT 
  naam,
  COUNT(case when position in (4,5)  then 1 else NULL end) as "aantal 1",
  COUNT(case when position  = 6  then 1 else NULL end) as "aantal 2",
  COUNT(case when position  position <> 6  then 1 else NULL end) as "aantal 2" 
FROM
  brontabel
WHERE
  eventdate BETWEEN '20090617' AND '20090619' 
GROUP BY
  naam


Netjes met COUNT, COUNT teld alleen als de waarde niet NULL is, als de CASE dus NULL terug geeft, telt ie niet.

Edit:
Waarom zijn we quotjes om getallen aan het zetten :?

[ Voor 6% gewijzigd door RobertMe op 18-06-2009 17:24 ]


Acties:
  • 0 Henk 'm!

  • sjunnie
  • Registratie: September 2001
  • Laatst online: 19-09 19:02

sjunnie

U mag ook Sjun zeggen

Topicstarter
RobertMe schreef op donderdag 18 juni 2009 @ 17:21:
Ik ga niet mee met het voorstel van freak-ish, maar maak er een afgeleide van :+
SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT 
  naam,
  COUNT(case when position in (4,5)  then 1 else NULL end) as "aantal 1",
  COUNT(case when position  = 6  then 1 else NULL end) as "aantal 2",
  COUNT(case when position  position <> 6  then 1 else NULL end) as "aantal 2" 
FROM
  brontabel
WHERE
  eventdate BETWEEN '20090617' AND '20090619' 
GROUP BY
  naam


Netjes met COUNT, COUNT teld alleen als de waarde niet NULL is, als de CASE dus NULL terug geeft, telt ie niet.

Edit:
Waarom zijn we quotjes om getallen aan het zetten :?
Super, -na enige minor changes- lijkt dit exact te doen wat ik zoek. _/-\o_

If you can judge a wise man by the color of his skin then mister you're a better man than I

Pagina: 1