[SQL] Berekening op een gemiddelde

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • DeathslayerNLL
  • Registratie: Oktober 2009
  • Laatst online: 04-09 15:01
Beste Tweakers,

Ik kan niet helemaal uit een vraag voor school komen..
Ik ben een SQL beginner, maar kan het echt nergens op het web vinden...

De opdracht is om een gemiddelde te berekenen van een score, en daarna van dit gemiddelde de standaard deviatie te berekenen..

Ik had dit zo in gedachte:


code:
1
2
3
4
5
SELECT WAMMIfactor.name, AVG(rating.score) AS Average, std(Average)
FROM statement, WAMMIfactor, rating
WHERE WAMMIfactor.factorcode = statement.factorcode
AND statement.statementcode = rating.statementcode
GROUP BY statement.factorcode


Maar dit werkt, zoals ik al had verwacht, niet..
Ik hoop dat de vraag duidelijk is, maar heeft iemand een idee hoe ik dat dan kan doen?

Alvast bedankt!

[ Voor 5% gewijzigd door DeathslayerNLL op 11-10-2011 20:57 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DeathslayerNLL schreef op dinsdag 11 oktober 2011 @ 20:49:
Maar dit werkt, zoals ik al had verwacht, niet..
Welke foutmelding krijg je? Begin daar eens mee. Verder is 't ook handig te weten over welk RDBMS we praten: MySQL? SQL Server? PostgreSql? Oracle? We hebben geen glazen bol you know ;) (Ik vermoed MySQL, die kent namelijk de Std() aggregate terwijl dat bij andere RDBMS'en anders heet)
Verder zou ik heel snel af stappen van die impliciete joins en gewoon join syntax gebruiken en eens goed kijken naar je Group By (Hoe werkt dat GROUP BY nu eigenlijk?).

Verder: Als je code post, gebruik dan code tags a.u.b

[ Voor 40% gewijzigd door RobIII op 11-10-2011 21:00 ]

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


Acties:
  • 0 Henk 'm!

  • DeathslayerNLL
  • Registratie: Oktober 2009
  • Laatst online: 04-09 15:01
Uknown column 'average' in field list

Is de error die die geeft.. Omdat Average eigenlijk niet echt als kolom bestaat ofc :$
Maar ik kan er niet achter komen hoe het ook alweer wel moet..

En het is denk ik inderdaad MySQL.. uiteraard als ik al deze dingen wist dan had ik dit vermeld haha, maar zoals ik al zei weet ik er nog vrij weinig vanaf..:$

[ Voor 29% gewijzigd door DeathslayerNLL op 11-10-2011 20:58 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
DeathslayerNLL schreef op dinsdag 11 oktober 2011 @ 20:55:
Uknown column 'average' in field list

Is de error die die geeft.. Omdat Average eigenlijk niet echt als kolom bestaat ofc :$
Logisch nadenken :?

SQL:
1
SELECT ..., ..., AVG(rating.score) AS Average, std(AVG(rating.score))
DeathslayerNLL schreef op dinsdag 11 oktober 2011 @ 20:55:
En het is denk ik inderdaad MySQL.. uiteraard als ik al deze dingen wist dan had ik dit vermeld haha, maar zoals ik al zei weet ik er nog vrij weinig vanaf..:$
Al weet je 0,0 van SQL, dan kun je toch wel vermelden welk product je gebruikt :? Evenals het vermelden van een foutmelding; dat staat zelfs in onze Quickstart aangegeven (puntje 7).

[ Voor 42% gewijzigd door RobIII op 11-10-2011 21:02 ]

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


Acties:
  • 0 Henk 'm!

  • DeathslayerNLL
  • Registratie: Oktober 2009
  • Laatst online: 04-09 15:01
Excuus, ik zal dit in het vervolg vermelden!
(Het programma dat gebruikt word heet MySQL Query Analyzer)

Als ik de oplossing invul die U geeft, krijg ik de volgende error:
invalid use of group function

Ik heb deze error even opgezocht, en krijg dit als mogelijke feedback (op een ander voorbeeld):
you can only do one level of aggregation in any grouping

Ik heb dit gevonden op http://www.dbforums.com/m...d-use-group-function.html

Heeft u enig idee hoe ik deze fout kan verhelpen?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Lees RobIII in "[SQL] Berekening op een gemiddelde" nog eens; daar staat namelijk (een link naar) het antwoord in...
Oh wacht even... nee, my bad.

Ik snap 't effe niet. Waarom zou je de std van de avg willen? Bedoel je dus niet gewoon std(rating.score) i.p.v std(avg(rating.score))?

Als je per sé de std van de avg wil hebben:

SQL:
1
2
3
4
5
6
7
8
9
10
11
select x.name, x.gem, std(x.gem)
from (
  select y.name, avg(y.foo) as gem
  from y
  where ...
  inner join ...
  ...
  ...
  group by y.name
) as x
group by x.name, x.gem

maar dat gaat natuurlijk altijd 0 geven...

[ Voor 157% gewijzigd door RobIII op 11-10-2011 21:59 ]

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


Acties:
  • 0 Henk 'm!

  • Mystic_Jack
  • Registratie: Juni 2001
  • Niet online
DeathslayerNLL schreef op dinsdag 11 oktober 2011 @ 20:49:
Beste Tweakers,

Ik kan niet helemaal uit een vraag voor school komen..
Ik ben een SQL beginner, maar kan het echt nergens op het web vinden...

De opdracht is om een gemiddelde te berekenen van een score, en daarna van dit gemiddelde de standaard deviatie te berekenen..

Ik had dit zo in gedachte:


code:
1
2
3
4
5
SELECT WAMMIfactor.name, AVG(rating.score) AS Average, std(Average)
FROM statement, WAMMIfactor, rating
WHERE WAMMIfactor.factorcode = statement.factorcode
AND statement.statementcode = rating.statementcode
GROUP BY statement.factorcode


Maar dit werkt, zoals ik al had verwacht, niet..
Ik hoop dat de vraag duidelijk is, maar heeft iemand een idee hoe ik dat dan kan doen?

Alvast bedankt!
Als ik jouw query letterlijk overneem naar MSSQL(hier ben ik redelijk bekend mee) dan heb ik iets zoals dit met een CTE:

SQL:
1
2
3
4
5
6
7
8
9
10
with as cte
(
SELECT WAMMIfactor.name, AVG(rating.score) AS Average
FROM WAMMIfactor 
        inner join statement on WAMMIfactor.factorcode = statement.factorcode
        inner join rating on statement.statementcode = rating.statementcode
group by WAMMIfactor.name
)

select cte.name, std(cte.average)


Alleen ik zag net dat MySQL "with" niet kent.
Want jij bent nu in dezelfde select statement een kolomnaam aan het aggregeren die je zelf als had toegekend aan een geaggregeerde kolom. Je kan alleen iets hergebruiken als het al bekend is. In dit geval is de kolomnaam Average nog niet bekend.

Je zou iets moeten verzinnen wat het zelfde doet als mijn query.

'We're losing touch with ourselves in the technological world, and it is increasingly important to take time out.'


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Larrs schreef op dinsdag 11 oktober 2011 @ 22:15:
Alleen ik zag net dat MySQL "with" niet kent.
Je kan de boel in de FROM zetten (zie R3 hierboven), dat doet exact hetzelfde.
Je zou iets moeten verzinnen wat het zelfde doet als mijn query.
Tsja, het lijkt me niet dat je (divide by) 0 moet gaan zitten berekenen... :p Misschien dat de stdev over alle gemiddeldes bedoelt wordt, in plaats van per naam. Dus iets als:
SQL:
1
2
3
4
5
6
7
select std(Average)
from (
  select avg(y.foo) as Average
  from y
  where ...
  group by y.id
) as subquery

maar zelfs dat lijkt me vreemd. Waarschijnlijker is dat TS de opdracht niet goed heeft gelezen en dat het gewoon std(rating.score) moet zijn ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1