[asp][ms sql]GROUP BY, HAVING (wederom)

Pagina: 1
Acties:

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 01-09 21:13
Blijkbaar heb ik de GROUP BY.. HAVING nog niet helemaal onder de knie.

Met de volgende query:
code:
1
2
3
SELECT COUNT(borderid) as AantalBorderid, 
COUNT(volgnummer) as AantalVolgNummer, datum, lowresfile, gedrukt 
FROM dbo.bestellingen  GROUP BY borderid HAVING gedrukt = 'ja'

loopt ie spaak op "datum", "lowresfile" en gedrukt.

Zonder datum, lowresfile en gedrukt werkt ie wel. Ik heb alleen die velden ook nodig.

Ik ben dit allemaal aan het proberen in de Query Analyzer van MS SQL 7 (dat is ook de DB server).

Hij komt dan met:
code:
1
2
3
Column 'dbo.bestellingen.datum' is invalid in the select
 list because it is not contained in either an aggregate 
function or the GROUP BY clause.

Weet iemand hier iets voor?

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Wat je wil kan ook niet:

Ten eerste wil je de ID's tellen. De functie retourneert dan het aantal.

Echter,

Dan wil je data erbij? De datum van de bestelling neem ik aan. Dat kan niet want het enige wat er gebeurt is dat de functie count wordt uitgevoerd. Hij kan bij die functie geen data weergeven want er worden geen afzonderlijke records weergegeven.

Er kan dus niet aan een kolom met daarin de datum worden gerefereerd.

Hoop dat je het snapt, want ik ben niet erg goed in dit soort dingen uitleggen :P

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 22-06 15:30
code:
1
2
3
4
SELECT COUNT(borderid) as AantalBorderid, 
COUNT(volgnummer) as AantalVolgNummer, datum, lowresfile, gedrukt 
WHERE gedrukt = 'ja'
FROM dbo.bestellingen  GROUP BY borderid

Waarom doe je het niet zo ?? Having is namelijk alleen bedoelt als je de resultset achteraf wilt bewerken.

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


  • Greyfox
  • Registratie: Januari 2001
  • Laatst online: 30-08 17:13

Greyfox

MSX rulez

Je moet alle velden in je select, afgezien van je geaggregeerde velden, ook bij je group by noemen.

MSX 2 rulez more


Verwijderd

Op dinsdag 23 juli 2002 12:51 schreef paulh het volgende:
code:
1
2
3
4
SELECT COUNT(borderid) as AantalBorderid, 
COUNT(volgnummer) as AantalVolgNummer, datum, lowresfile, gedrukt 
WHERE gedrukt = 'ja'
FROM dbo.bestellingen  GROUP BY borderid

Waarom doe je het niet zo ?? Having is namelijk alleen bedoelt als je de resultset achteraf wilt bewerken.
Dat levert je dus hetzelfde probleem op.

  • paulh
  • Registratie: Juli 1999
  • Laatst online: 22-06 15:30
Op dinsdag 23 juli 2002 12:53 schreef HPE het volgende:

[..]

Dat levert je dus hetzelfde probleem op.
Dat is wel waar maar je moet IMHO geen having gebruiken als je een where kan gebruiken.

[ZwareMetalen.com] - [Kom in aktie tegen de CO2 maffia]


Verwijderd

Edit: effe geprobeerd: ik denk dat Greyfox gelijk heeft. Alle kolommen vermelden in de Group BY.

Dus:
code:
1
2
3
4
5
SELECT COUNT(borderid) as AantalBorderid, 
COUNT(volgnummer) as AantalVolgNummer, datum, lowresfile, gedrukt 
FROM dbo.bestellingen  
GROUP BY borderid , volgnummer, datum, lowresfile, gedrukt
HAVING gedrukt = 'ja'

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 01-09 21:13
Thanks, ik heb hem nog ff uitgebreid met DISTINCT en nu is die helemaal goed...

Weer wat geleerd dat je in de grou by gewoon je velden terug moet laten komen.

/edit: met die distinct er bij loopt ie weer niet helemaal fris, maar ik ben nu iig een stap verder

/edit2:
Door een beetje buggy code aan het begin van dit gedoe (+/- 3 mnd. geleden) is er een foutje ontstaan bij het inserten in de db van de ordernummers:

Bijv: ordernummer 123456 bevat 4 volgnummers en ordernummer 123457 bevat er 1 van. Deze ordernummers moeten dus samengevoegd worden. Het is dus zo dat de laatste 3 cijfers van het ordernummer anders kunnen zijn, 456, 457, of 458. (of 458, 459,500 <- is minuten en seconden namelijk.) Is dit ook nog mogelijk in 1 query?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 01-09 21:13
Hee, hij werkt gewoon met LIKE! :)

/edit: damn, toch niet... verder zoeken maar weer (sorry voor het kicken trouwens!) :(

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 01-09 21:13
Niemand die een oplossing weet voor onderstaand probleem?
Door een beetje buggy code aan het begin van dit gedoe (+/- 3 mnd. geleden) is er een foutje ontstaan bij het inserten in de db van de ordernummers:

Bijv: ordernummer 123456 bevat 4 volgnummers en ordernummer 123457 bevat er 1 van. Deze ordernummers moeten dus samengevoegd worden. Het is dus zo dat de laatste 3 cijfers van het ordernummer anders kunnen zijn, 456, 457, of 458. (of 458, 459,500 <- is minuten en seconden namelijk.) Is dit ook nog mogelijk in 1 query?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 01-09 21:13
nu:
code:
1
2
3
4
SELECT DISTINCT(borderid), COUNT(*) as AantalBorderID,
gedrukt, lowresfile FROM dbo.bestellingen GROUP BY 
borderid, gedrukt, lowresfile HAVING borderid LIKE '%
&quot;&amp;OrderCodeWaarde&amp;&quot;%' AND gedrukt = 'ja' ORDER by borderid Desc

de borderid LIKE wordt uitgelezen uit een andere query. Die query gaat loopen en in die loop wordt bovenstaande query weer uitgevoerd. Het is niet netjes alleen weet ik niet hoe het anders moet.

Een groot probleem nu is nog: Die distinct werkt dus niet meer! :( Iemand een tip/idee/suggestie! :?

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

/me lacht
Feitelijk heb je dus een data / db ontwerpprobleem. Je hebt herhalende groepen binnen 1 tabel die uitgenormaliseerd dienen te worden. En dat probleem wil je oplossen door een gammele query waar je alle SQL truken voor uit de kast moet trekken. Daardoor wordt je query traag, onoverzichtelijk en onbetrouwbaar.

Kortom, los het dataprobleem handmatig op, en ga daarna met normale queries verder. Als je niet je fouten van voorheen op een degelijke manier oplost, valt uiteindelijk de hele applicatie uit elkaar.
Pagina: 1