[SQL] aggregate functions werken niet met meerdere rijen

Pagina: 1
Acties:

  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 19-05 21:37
Ik heb een query waarbij ik aggregate functions moet gebruiken zoals AVG of POWER. Maar als ik de query dan uitvoer geeft hij errors dat bepaalde kollommen die ik aanroep niet onder een een aggregate function vallen of een Group by.
Als ik dan die kolommen onder GROUP BY zet werkt de query wel, maar krijg ik overal als waarde 0...

Het gaat om de volgende query:
code:
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT (synops_t2m - AVG(synops_t2m)) * (debav_t2m - AVG
(debav_t2m)) AS cov, debav AS reeks, datum

FROM         beek

WHERE     (datum BETWEEN CONVERT(DATETIME, '2003-1-1', 102) AND CONVERT
(DATETIME, '2003-2-1', 102)) AND (voorspeltermijn = 12) AND
                     (debav_t2m IS NOT NULL) AND (synops_t2m IS NOT NULL)

GROUP BY synops_t2m, debav_t2m, datum, debav


Het gaat om de berekening van cov. Hier komt nu bij elke datum een 0 uit:
cov reeks datum
0 debav 1-1-2003 6:00:00
0 debav 1-1-2003 9:00:00
0 debav 1-1-2003 12:00:00

Dit klopt gewoon niet, het gaat erom dat ik een waarde minus de gemiddelde waarde van de kolom wil doen...

Kan iemand mij hiermee helpen? Heel veel dank!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:53
Die distinct moet er weg.
Je group by clause is verkeerd; enkel de velden die in je select list staan, en die geen aggregated functie zijn, moet je in de group by opnemen.
In jouw geval is dat dus reeks en datum

edit:
Ow, ik zie nog iets raars: je wilt het berekende gemiddelde aftrekken van een andere column ? Ik weet niet of dat zomaar werkt....

[ Voor 25% gewijzigd door whoami op 26-05-2004 11:23 ]

https://fgheysels.github.io/


  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 19-05 21:37
whoami schreef op 26 mei 2004 @ 11:22:
Die distinct moet er weg.
Je group by clause is verkeerd; enkel de velden die in je select list staan, en die geen aggregated functie zijn, moet je in de group by opnemen.
In jouw geval is dat dus reeks en datum

edit:
Ow, ik zie nog iets raars: je wilt het berekende gemiddelde aftrekken van een andere column ? Ik weet niet of dat zomaar werkt....
distinct was idd niet nodig, als ik bij group by reeks zet zegt hij invalid column name :?, dat werkt dus niet. En als ik dit andere er niet in opneem, geeft hij weer een error dat die kolommen niet zijn opgenomen ergens bij...

Maar ik kan dus niet het berekende gemiddelde aftrekken van de echter waarde van die kolom? Dat is namelijk wel de bedoeling, of zijn er nog andere manieren?

edit: Als ik de query uitvoer zoals hij bovenaan staat doet hij volgens mij cel1 min het gemiddelde van cel1 (=0 natuurlijk). Terwijl hij cel1 - gemiddelde van cel1:celx moet doen...

[ Voor 10% gewijzigd door DarkShadow op 26-05-2004 11:28 ]


  • _VpS_
  • Registratie: September 2002
  • Laatst online: 14-04-2023
Group By Datum, debav (niet reeks)

Je kunt de gemiddelde over cel1:celx van tevoren berekenen en dan in de query als een constante gebruiken.

(bb) || !(bb)


  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 19-05 21:37
_VpS_ schreef op 26 mei 2004 @ 11:42:
Group By Datum, debav (niet reeks)

Je kunt de gemiddelde over cel1:celx van tevoren berekenen en dan in de query als een constante gebruiken.
yup, kwam dr net achter dat ik debav ipv reeks moest doen, maar hoe bedoel je de rest?

Eerst een connectie aanmaken, met query met daarin AVG(cel) as constante
conn.close

en dan

conn2.open
query met cel1 - constante
conn2.sluiten

zo, of had je iets anders in gedachten...

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:53
Waarom zou je een connectie sluiten, en dan opnieuw connecten ? Dat kan allemaal binnen 1 connectie.

https://fgheysels.github.io/


  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 19-05 21:37
yup ok, maar het moeten dan dus wel 2 query's zijn?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:00

Janoz

Moderator Devschuur®

!litemod

Dit kan niet in 1 query. De resultaten van een query werken eigenlijk altijd per rij. Je kunt wel verschillende dingen samenvoegen tot 1 rij (mbv group by en aggregate functions) maar nooit een hele kolom combineren en dit vervolgens op meerdere rijen toepassen.

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


  • DarkShadow
  • Registratie: Juli 2000
  • Laatst online: 19-05 21:37
hmm jammer, maar ik maak nu eerst wel de juiste variabelen aan en die gebruik ik dan weer in mn nieuwe query, hopelijk werkt dat gewoon goed :)

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Als je gebruik maakt van MSSQL is jouw probleem volgens mij op te lossen door gebruik te maken van een derived table.

[ Voor 9% gewijzigd door cameodski op 26-05-2004 13:46 ]

Never underestimate the power of

Pagina: 1