AndieeMedlem sedan mars 2000167 inlägg 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 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 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 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 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 Är mitt problem otydligt eller är min struktur på databasen konstig?
LarsGMedlem sedan dec. 200012 464 inlägg 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 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 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 Lyfter på hatten och tackar så mycket för både tålamodet och hjälpen!