webForumDet fria alternativet

Sum() blir för stort/mycket

Databaser & SQL

12 svar · 325 visningar · startad av ZeTa

Medlem sedan aug. 200315 inlägg
Frågan#1

Här är min SQL:

SELECT accounts.ID, accounts.owner, accounts.race, (Sum(citys.s1) + Sum(armys.s1)) AS sumS1, (Sum(citys.s2) + Sum(armys.s2)) AS sumS2, (Sum(citys.s3) + Sum(armys.s3)) AS sumS3, accounts.kingdomID, Count(citys.ID) AS cCity

FROM accounts, armys, citys

WHERE accounts.ID = citys.ownerID AND accounts.ID = armys.ownerID GROUP BY accounts.ID, owner, race, kingdomID

ORDER BY (Sum(citys.s1) + Sum(citys.s2) * 2 + Sum(citys.s3) * 3 + Sum(armys.s1) + Sum(armys.s2) * 2 + Sum(armys.s3) * 3) DESC

sumS1, sumS2 och sumS3 blir för stora! Tror Sum(armys.*) blir räknat gånger antal Count(citys.ID) tror jag.. typ :OO

HJÄLP!

Medlem sedan mars 20034 471 inlägg
#2

Jaha, och vad vill du göra? :q

Dessutom kommer ju din Order by-klausul att innehålla ett numeriskt värde. Hur ska du kunna ordna något efter en siffra?

Efter Order by ska stå den/de kolumn(er) du vill ordna resultatet efter.

Medlem sedan aug. 200315 inlägg
#3

aasah skrev:

Jaha, och vad vill du göra?

Jag vill att sumS1 ska bli summan av antalet s1 i armys och citys. Inte som det är nu att jag får produkten.

aasah skrev:

Dessutom kommer ju din Order by-klausul att innehålla ett numeriskt värde. Hur ska du kunna ordna något efter en siffra?

Det går alldeles utmärkt att ordna efter en siffra! 1 kommer före 3 och 51 kommer före 52 osv.

Medlem sedan aug. 200315 inlägg
#4

Scripted som jag använder SQL-satsen till funkar, bara det att sumS1 blir typ 500 gånger större än det ska vara :p

Medlem sedan aug. 200315 inlägg
#5

cCity blir också multiplicerat med antalet armys-rader. Annars skulle jag kunna löst det på ett styggt sätt :P

 (Sum(citys.s1) + Sum(armys.s1)/Count(citys.ID)) AS sumS1
Medlem sedan aug. 200315 inlägg
#6

anyone?

Medlem sedan dec. 200012 464 inlägg
#7

Dela upp det i två frågor. En med count på city och en med summering.

Efter Order by ska stå den/de kolumn(er) du vill ordna resultatet efter.

Nej, det stämmer inte. Det går att ange uttryck i en order by.

Medlem sedan aug. 200315 inlägg
#8

Dela upp det i två frågor. En med count på city och en med summering.

Jo, jag fick göra sö och sen dela med count på citys :p
Så det blir rätt värden nu, även fast det blir stygga värden med summeringe. Fast skit samma, huvudsaken det funkar :)

Medlem sedan mars 20034 471 inlägg
#9

LarsG skrev:

aasah skrev:

Efter Order by ska stå den/de kolumn(er) du vill ordna resultatet efter.

Nej, det stämmer inte. Det går att ange uttryck i en order by.

Jag är ledsen om jag sa något som var felaktigt. :r Det var inte med flit.

Men, jag trodde att när man skrev tex:
Select a, b, c .... order by 2
Så blev det samma som att skriva
Select a, b, c .... order by b - i det här fallet.

Uppenbarligen har jag fel, så vad gäller? :q Och kan någon ange ett exempel med ett uttryck av ZeTas typ i order by, vilket förklarar vad som händer och hur det funkar med numeriska uttryck där? :q Skulle uppskattas!

Medlem sedan dec. 19996 721 inlägg
#10

Nja, helt fel har du inte. Om man skriver en numerisk literal (t.ex. ORDER BY 2)
i ORDER BY så tolkas den som en resultatkolumnsposition, precis som du angav. Jag har för mig att detta inte är helt rumsrent enligt SQL-standarden, men det är så det funkar i Access och MS SQL Server.

ORDER BY 2

är alltså inte samma sak som

ORDER BY 2*1

Medlem sedan mars 20034 471 inlägg
#11

emission skrev:

Nja, helt fel har du inte. Om man skriver en numerisk literal (t.ex. ORDER BY 2)
i ORDER BY så tolkas den som en resultatkolumnsposition, precis som du angav. Jag har för mig att detta inte är helt rumsrent enligt SQL-standarden, men det är så det funkar i Access och MS SQL Server.

ORDER BY 2

är alltså inte samma sak som

ORDER BY 2*1

OK, tack! :) Och bra att veta att det inte var helt fel. Men... vad innebär Order by 2*1 då? Ett exempel skulle verkligen uppskattas.

Medlem sedan dec. 200012 464 inlägg
#12

Att använda en siffra för att ange en kolumn i select-listan försvann ur standarden i och med SQL 99. Då tillät man att man i stället använde ett kolumnalias

select sum(a) as s, c from t group by c order by s desc

Ovanstående är alltså det rekommenderade sättet men det fungerar t.ex. inte i access.

Att använda en konstant i order by innebär enligt SQL 99 i princip ingenting eftersom det blir samma värde för alla poster och därmed inte påverkar sorteringsordningen alls.

Däremot om man använder t.ex.

select a,b from t order by a+b

så blir värdet (eventuellt) olika för olika poster och kan därmed påverka sorteringsordningen.

Medlem sedan mars 20034 471 inlägg
#13

Tack LarsG för hela genomgången! :)

LarsG skrev:

...Däremot om man använder t.ex.

select a,b from t order by a+b

så blir värdet (eventuellt) olika för olika poster och kan därmed påverka sorteringsordningen.

Om

a   b
1   3
2   1
3   1

Så kommer det enligt satsen ovan ut i ordningen:

a+b = 3
a   b
2   1

a+b = 4
a   b
1   3
3   1

Har jag fattat rätt då? :q

268 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)