webForumDet fria alternativet

Statistik och SUM, COUNT

9 svar · 525 visningar · startad av Andiee

AndieeMedlem sedan mars 2000167 inlägg
#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...

LarsGMedlem 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
AndieeMedlem 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.

LarsGMedlem 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)
AndieeMedlem 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?

AndieeMedlem sedan mars 2000167 inlägg
#6

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

LarsGMedlem 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.

AndieeMedlem 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...

LarsGMedlem 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
AndieeMedlem sedan mars 2000167 inlägg
#10

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

136 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)