webForumDet fria alternativet
Logga in / Bli medlem

Statistik och SUM, COUNT

Databaser & SQL

9 svar · 527 visningar · startad av Andiee

Medlem sedan mars 2000167 inlägg
Trådstart#1

Hey,

Småproblem med en SQL-sats som ska räkna ut statistik från en tabell. Tabellen tblStatistik ser ut såhär:

tblStatistik
     fldID   - unikt id
     fldMatchID   - referarar till vilken match det är
     fldMal   - id på den spelare som gjort mål
     fldAssist   - id på den spelare som assisterat
     fldU2   - id på den spelare som blir utvisad 2 min
     fldU5   - id på den spelare som blir utvisad 5 min
     fldU10   - id på den spelare som blir utvisad 10 min

Det jag vill då är att räkna ut för varje spelare antal gjorda mål, antal gjorda assist och antal utvisningsminuter. Anledningen till det här sättet att lägga in mål är för att jag sen vill kunna få ut mer detaljerad information.

Iaf. Just nu använder jag sen här SQL-satsen:

SELECT t1.fldID, t1.fldLiga, t1.fldNamn, 
   COUNT(t2.fldMal) AS fldMal,
   COUNT(t2.fldAssist) AS fldAssist,
   COUNT(t2.fldU2) AS fldU2,
   COUNT(t2.fldU5) AS fldU5,
   COUNT(t2.fldU10) AS fldU10,
   SUM(fldMal + fldAssist) AS fldPoang
FROM tblSpelarpresentation t1 
INNER JOIN tblStatistik t2 ON t1.fldID = t2.fldMal OR t1.fldID = t2.fldAssist OR t1.fldID = t2.fldU2 OR t1.fldID = t2.fldU5 OR t1.fldID = t2.fldU10
WHERE t1.fldLiga = 'herr'
GROUP BY t1.fldID
ORDER BY fldPoang DESC, t1.fldNamn ASC

De felen jag får är att dels listar den inte varje spelare, alltså de som inte gjort några poäng finns heller inte med i statistiklistan. Och det vill jag ju.
Dels så vill jag att att fldPoang ska räkna ut antalet fldMal + fldAssist, inte lägga ihop de id som finns där.
Någon som kan hjälpa mig?

Och förståss, MySQL är det som gäller...

Medlem sedan dec. 200012 464 inlägg
#2
SELECT t1.fldID, t1.fldLiga, t1.fldNamn, 
   COUNT(t2.fldMal) AS fldMal,
   COUNT(t2.fldAssist) AS fldAssist,
   COUNT(t2.fldU2) AS fldU2,
   COUNT(t2.fldU5) AS fldU5,
   COUNT(t2.fldU10) AS fldU10,
   SUM(fldMal + fldAssist) AS fldPoang
FROM tblSpelarpresentation t1 
LEFT JOIN tblStatistik t2 ON t1.fldID = t2.fldMal 
OR t1.fldID = t2.fldAssist 
OR t1.fldID = t2.fldU2 
OR t1.fldID = t2.fldU5 
OR t1.fldID = t2.fldU10
WHERE t1.fldLiga = 'herr'
GROUP BY t1.fldID, t1.fldLiga, t1.fldNamn
ORDER BY fldPoang DESC, t1.fldNamn ASC
Medlem sedan mars 2000167 inlägg
#3

Tack, nu listar den alla spelare som finns. Nu återstår bara problemet med att räkna fram poängen.

Medlem sedan dec. 200012 464 inlägg
#4

Jaha, det missade jag.

sum(case when fldMal is null then 0 else 1 end
 + case when fldAssist is null then 0 else 1 end)
Medlem sedan mars 2000167 inlägg
#5

Problemet som jag har när den räknar ihop poäng är att t.ex. kolumnen fldMal refererar till ett ID på en spelare i en annan tabell. När man räknar summan av poäng så slår den ihop ID:na istället, medan jag vill att den ska räkna ut antalet poster där just det ID:et finns. Har jag gjort helt fel i min SQL-sats för att lyckas med det?

Medlem sedan mars 2000167 inlägg
#6

Är mitt problem otydligt eller är min struktur på databasen konstig?

Medlem sedan dec. 200012 464 inlägg
#7

Ja, på båda frågorna. Jag trodde att det löste sig med hjälp av case. Exemplifiera med datainnehåll och förväntat resultat.

Medlem sedan mars 2000167 inlägg
#8

Så här ser tabellen för statistiken ut. fldMatchID refererar till ett id på en match i en annan tabell. fldMal, fldAssist, fldU2, fldU5 och fldU10 ska innehålla id som kopplar ihop dem men en spelare i en tredje tabell.

[b]tblStatistik[/b]
[b]fldID[/b]	[b]fldMatchID[/b]	[b]fldMal[/b]	[b]fldAssist[/b]	[b]fldU2[/b]	[b]fldU5[/b]	[b]fldU10[/b]
1	23		5	11	 	0 	0 	0
4 	23		6	5		0 	0 	0
5	23		5	6	 	0 	0 	0

Det jag vill räkna ut är ju hur många poster som t.ex. ID nr 5 har gjort mål, alltså i detta fall 2 st. Sen ska det ju räknas ut hur många poster som t.ex. ID nr 5 har gjort assist, i detta fall 1 st assist. Sen ska fldMal och fldAssist adderas för att ge fldPoang.

Det ska ge resultatet (spelarens ID inom parentes):

[b]Herrstatistik[/b]
[b]Namn[/b]		[b]Poäng[/b]
Frank (5)	3
John (6)	2
Daniel (11)	1
Anders		0
Andreas		0
...

Men ger istället

[b]Herrstatistik[/b]
[b]Namn[/b]		[b]Poäng[/b]
Frank (5)	6
John (6)	4
Daniel (11)	2
Anders		0
Andreas		0
...

Av någon anledning så dubblar den resultatet. Jag vet inte vad felet är...
Tillägger också att när jag bara hämtar ut fldMal och fldAssist är de också dubbelt så mycket som de ska vara...

Medlem sedan dec. 200012 464 inlägg
#9

Jag trodde att du hade separata rader för mål och assist

sum(case when fldMal = t1.fldid then 1 else 0 end
 + case when fldAssist = t1.fldid then 1 else 0 end)

sen så förmodade jag att du lagrade null och inte noll. Om du inte vill ändra det så får du byta

COUNT(t2.fldU2) AS fldU2,

mot

sum(case when t2.fldU2 = 0 then 0 else 1 end) as fldU2
Medlem sedan mars 2000167 inlägg
#10

Lyfter på hatten och tackar så mycket för både tålamodet och hjälpen!

743 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
335 ms — deklarationer (db)
0 ms — hämta statistik (cache)
405 ms — hämta tråd, inlägg och bilagor (db)
259 ms — ändringar (db)