webForumDet fria alternativet

Group by

4 svar · 205 visningar · startad av andreas_lindh

andreas_lindhMedlem sedan jan. 20011 140 inlägg
#1

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

Hur ska jag göra för att det ska fungera?

doggelitoMedlem sedan juni 20003 076 inlägg
#2

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
andreas_lindhMedlem sedan jan. 20011 140 inlägg
#3

ok. När jag tar med alla kolumner i group by räknar den fel. jag vill endast ha med t.uID i group by.

Hur ska jag göra då?

Engine^Medlem sedan dec. 20003 887 inlägg
#4

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.

joupMedlem sedan feb. 2002116 inlägg
#5

Lägg t.uID först i group by.

Alltså:

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.

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