Toon posts:

[SQL - MS Access] Waarde van 2 queries optellen

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

Verwijderd

Topicstarter
Ik kom hier niet helemaal uit.

Ik heb 2 tabellen, CompetitieTegenstanders en CompetitieWedstrijden. CompetitieTegenstanders bevat informatie over teams zoals naam en CompetitieWedstrijden bevat alle wedstrijden van elk team.

In CompetitieWedstrijden zijn 4 kolommen van belang:
thuisTeamID, thuisScore, uitTeamID en uitScore.

Wat ik wil is van elk team uit CompetitieTegenstanders het totaal aantal punten optellen en op basis daarvan een sortering maken zodat ik kan zien wie op welke positie staat etc.

Het probleem is dat een team de helft van de keren een thuisTeam is en de andere helft een uitTeam. Als het een thuisTeam is moet ik thuisScore gebruiken, zelfde geldt voor uitTeam/Score.

Het is geen probleem om queries te maken die alleen de som van de thuisScore/uitScore van elk team. Ik wil deze echter bij elkaar optellen om het sorteren mogelijk te maken in SQL.

SQL:
1
2
3
4
SELECT CompetitieTegenstanders.naam, Sum(CompetitieWedstrijden.thuisScore) AS SumOfthuisScore
FROM CompetitieTegenstanders INNER JOIN CompetitieWedstrijden ON CompetitieTegenstanders.tegenstanderID = CompetitieWedstrijden.thuisTeamID
GROUP BY CompetitieTegenstanders.naam, CompetitieTegenstanders.teamID
HAVING (((CompetitieTegenstanders.teamID)=48))

Ik hoop dat het een beetje duidelijk is zo.

Kan iemand me misschien een beetje op weg helpen?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SUM(iif(thuisscore = 0;thuisscore;uitscore)) as SumOfBeidescores

Je moet even de exacte syntax van het IIF statement opzoeken, maar het komt er op neer dat je controleert of 'thuisscore' 0 is (of leeg, of NULL) en indien dat zo is dat je de waarde van uitscore meeneemt.

Je hoeft overigens geen HAVING te gebruiken, maar je kunt gewoon WHERE gebruiken. HAVING is bedoeld voor aggregate waarden.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • BertS
  • Registratie: September 2004
  • Laatst online: 13-02 08:33
IMO is je tabel verkeerd. Je moet de record in tweeën splitsen, één record voor uit en één record voor thuis. Een veldje 'type' toevoegen om aan te geven of het uit of thuis is.

Verwijderd

Topicstarter
P_de_B schreef op woensdag 20 juli 2005 @ 20:11:
SUM(iif(thuisscore = 0;thuisscore;uitscore)) as SumOfBeidescores

Je moet even de exacte syntax van het IIF statement opzoeken, maar het komt er op neer dat je controleert of 'thuisscore' 0 is (of leeg, of NULL) en indien dat zo is dat je de waarde van uitscore meeneemt.

Je hoeft overigens geen HAVING te gebruiken, maar je kunt gewoon WHERE gebruiken. HAVING is bedoeld voor aggregate waarden.
Het probleem is dat zowel de thuisScore als uitScore een waarde hebben. vb. teamA wint thuis van teamB met 7-3, thuisScore is dan 7 en uitScore is 3. Beide waardes staan in dezelfde rij.

P.S: query is gegenereerd door MS Access dus heb dat ff overgenomen, zolang het werkt vind ik het al prima ;)
bee-es schreef op woensdag 20 juli 2005 @ 20:25:
IMO is je tabel verkeerd. Je moet de record in tweeën splitsen, één record voor uit en één record voor thuis. Een veldje 'type' toevoegen om aan te geven of het uit of thuis is.
De reden waarom ik zowel thuisScore als uitScore in 1 record zet is om een goed overzicht te hebben van alle wedstrijden, wie tegen wie speelt en wat de behaalde punten van elk team is. Jij bedoelt waarschijnlijk dat ik voor elk wedstrijd 2 records aanmaak, 1 voor thuisTeam en 1 voor uitTeam. Ik vind zelf dat het dan erg chaotisch wordt. Het staat vast dat per poule in de competitie 30 wedstrijden gespeeld worden en de volgorde staat ook vast. wedstrijd 1 is altijd A tegen B, wedstrijd 2 C tegen D etc.

Misschien dat jou manier wel beter is, ik heb nu echter een werkend systeem (en weinig tijd om het helemaal om te gooien) en hoop dat mijn manier ook mogelijk is.

  • BertS
  • Registratie: September 2004
  • Laatst online: 13-02 08:33
Verwijderd schreef op donderdag 21 juli 2005 @ 14:41:
[...]
De reden waarom ik zowel thuisScore als uitScore in 1 record zet is om een goed overzicht te hebben van alle wedstrijden, wie tegen wie speelt en wat de behaalde punten van elk team is. Jij bedoelt waarschijnlijk dat ik voor elk wedstrijd 2 records aanmaak, 1 voor thuisTeam en 1 voor uitTeam. Ik vind zelf dat het dan erg chaotisch wordt. Het staat vast dat per poule in de competitie 30 wedstrijden gespeeld worden en de volgorde staat ook vast. wedstrijd 1 is altijd A tegen B, wedstrijd 2 C tegen D etc.

Misschien dat jou manier wel beter is, ik heb nu echter een werkend systeem (en weinig tijd om het helemaal om te gooien) en hoop dat mijn manier ook mogelijk is.
Presentatie mag nooit van invloed zijn op de databaseinrichting...

Nu moet je eerst een samenvoegquery maken met UNION:
SELECT Naam, Thuisscore FROM...
UNION ALL SELECT Naam, Uitscore FROM...

Op die query kun je dan de berekening (som) uitvoeren.