Jag har en sql fråga som räknar ut hur mpnga poäng varje användare har i en tipstävling.
Nu har jag fått problem med group by. Det fungerade i mysql men inte nu när jag bytt till msSql.
CREATE PROCEDURE [tibroik1].[topplista]
@userID int, @omgang int
AS
Select top 15 s.id,s.omgang,s.serie_ID,m_id,t.uID,u.username,
count(t.id) as games,
(sum(case when s.ID = t.m_ID and (s.resultat_a = t.res_a and s.resultat_b = t.res_b) then 1 else 0 end)*3) as fpoints,
(sum(case when s.ID = t.m_ID and ((s.resultat_a = resultat_b and t.res_a = t.res_b) and (t.res_a <> s.resultat_a and t.res_b <> s.resultat_b)) then 1 else 0 end)*2) as ties,
(sum(case when s.ID = t.m_ID and ((s.resultat_a > s.resultat_b and t.res_a > t.res_b) and (s.resultat_a <> t.res_a and ((s.resultat_b <> t.res_b) or (s.resultat_b = t.res_b))) or (s.resultat_a <> t.res_a and t.res_a < t.res_b) and (s.resultat_b <> t.res_b and ((s.resultat_a <> t.res_a) or (s.resultat_a=t.res_a)))) then 1 else 0 end)) as points,
(sum(case when s.id = t.m_ID and (s.resultat_a = t.res_a and s.resultat_b = t.res_b) then 1 else 0 end)*3) + (sum(case when s.id = t.m_ID and ((s.resultat_a = s.resultat_b and t.res_a = t.res_b) and (t.res_a <> s.resultat_a and t.res_b <> s.resultat_b)) then 1 else 0 end)*2) + sum(case when s.ID = t.m_ID and ((s.resultat_a > s.resultat_b and t.res_a > t.res_b) and (s.resultat_a <> t.res_a and ((s.resultat_b <> t.res_b) or (s.resultat_b = t.res_b))) or (s.resultat_a <> t.res_a and t.res_a < t.res_b) and (s.resultat_b <> t.res_b and ((s.resultat_a <> t.res_a) or (s.resultat_a=t.res_a)))) then 1 else 0 end) as tpoints
FROM s_matcher s inner join tMatcher t on s.id = t.m_ID
left join tusers u on u.ID = t.uID
where s.uppdaterad = 1 and t.uID = @userID and s.omgang = @omgang
group by t.uID
order by tpoints Desc,fpoints Desc
Felmeddelande.
Column s.id is invalid in the select list becaus it is not contained in either as aggregate function or the group by clause
lång rackare!
alla kolumner man hämtar i selecten lär också finnas med i group by, förutom de man beräknar, typ count, sum mfl.
CREATE PROCEDURE [tibroik1].[topplista]
@userID int, @omgang int
AS
Select top 15 s.id,s.omgang,s.serie_ID,m_id,t.uID,u.username,
count(t.id) as games,
(sum(case when s.ID = t.m_ID and (s.resultat_a = t.res_a and s.resultat_b = t.res_b) then 1 else 0 end)*3) as fpoints,
(sum(case when s.ID = t.m_ID and ((s.resultat_a = resultat_b and t.res_a = t.res_b) and (t.res_a <> s.resultat_a and t.res_b <> s.resultat_b)) then 1 else 0 end)*2) as ties,
(sum(case when s.ID = t.m_ID and ((s.resultat_a > s.resultat_b and t.res_a > t.res_b) and (s.resultat_a <> t.res_a and ((s.resultat_b <> t.res_b) or (s.resultat_b = t.res_b))) or (s.resultat_a <> t.res_a and t.res_a < t.res_b) and (s.resultat_b <> t.res_b and ((s.resultat_a <> t.res_a) or (s.resultat_a=t.res_a)))) then 1 else 0 end)) as points,
(sum(case when s.id = t.m_ID and (s.resultat_a = t.res_a and s.resultat_b = t.res_b) then 1 else 0 end)*3) + (sum(case when s.id = t.m_ID and ((s.resultat_a = s.resultat_b and t.res_a = t.res_b) and (t.res_a <> s.resultat_a and t.res_b <> s.resultat_b)) then 1 else 0 end)*2) + sum(case when s.ID = t.m_ID and ((s.resultat_a > s.resultat_b and t.res_a > t.res_b) and (s.resultat_a <> t.res_a and ((s.resultat_b <> t.res_b) or (s.resultat_b = t.res_b))) or (s.resultat_a <> t.res_a and t.res_a < t.res_b) and (s.resultat_b <> t.res_b and ((s.resultat_a <> t.res_a) or (s.resultat_a=t.res_a)))) then 1 else 0 end) as tpoints
FROM s_matcher s inner join tMatcher t on s.id = t.m_ID
left join tusers u on u.ID = t.uID
where s.uppdaterad = 1 and t.uID = @userID and s.omgang = @omgang
group by s.id,s.omgang,s.serie_ID,m_id,t.uID,u.username
order by tpoints Desc,fpoints Desc
Vill endast ha med t.UI i GROUP BY... det skulle inte ge något vettigt, eftersom du vill ha dom 15 posterna med högst totalpoäng för en spelare - where ... t.uID = @userID ... Du kanske ska ta och ta bort den delen i where-satsen. Jag antar att du vill få ut top 15 spelare sorterat efter högsta totalpoäng...
Jag har för mig att det i MySQL går att skriva in valfritt antal av selectkolumnerna i group by-delen, men det är ju MySQL det.
group by t.uID,s.id,s.omgang,s.serie_ID,m_id,u.username
Har inte testat det själv, men jag har nyligen konverterat en sida från MySQL till MSSQL vilket har gjort att jag fått skriva om alla mina SQL-satser med group by, och när jag gjort så har jag aldrig stött på några problem.
260 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2