Avatar billede Klaphattens Novice
30. august 2012 - 14:14 Der er 12 kommentarer og
1 løsning

Kan man Order by SUM() where

Som overskriften nok siger vil jeg gerne vide om man kan fx:
Order by SUM(point) DESC, SUM(point) where opg = 1 DESC

Altså fx: hvis der er flere med samme altal point, skal point fra opg = 1 tælle mest?
Avatar billede arne_v Ekspert
30. august 2012 - 14:18 #1
proev:


... ORDER BY IF(opg=1, 0, 1) ASC, SUM(point) DESC
Avatar billede Klaphattens Novice
30. august 2012 - 14:32 #2
Umidbart virker det perfekt.
Men du må lige forklare den lidt nærmere.

Hvorfor står IF sætningen før SUM, når den er anden valg.
Avatar billede arne_v Ekspert
30. august 2012 - 15:12 #3
Det er vist en fejl, det skal nok vaere:

... ORDER BY SUM(point) DESC, IF(opg=1, 0, 1) ASC
Avatar billede arne_v Ekspert
30. august 2012 - 15:13 #4
Pointen er brug af IF
Avatar billede Klaphattens Novice
30. august 2012 - 15:13 #5
Jeg leger lidt med tanken om at lave en order by, der er lidt lang. jeg kan dog ikke helt gennemskue hvordan det kan gøres med din løsning. Række følgen er:

ORDER BY
  SUM(point) DESC,
  SUM(point) WHERE opg=1 DESC,
  (SUM(point)-SUM(tab)) DESC,
  (SUM(point)-SUM(tab)) WHERE opg=1 DESC

Og i nogen situationer vil jeg gerne sætte en limit på fx:
  LIMIT 0, 1

Hvordan kommer sådan en  ORDER BY så til at se ud?
Avatar billede Klaphattens Novice
30. august 2012 - 15:43 #6
Nå havde ikke set #3 og #4 der kom imens jeg skrev #5.

Skal nok have den uddybet lidt mere. :)
IF(opg=1, 0, 1) ASC

Hvordan ved if-sætningen, at det er sum(point) hvor opg=1 den skal regne med?
Altså hvis jeg nu ville have situationen som beskrevet i #5, hvordan kan if-sætningen skelne mellem SUM(point) og (SUM(point)-SUM(tab)) situationen?

Det har måske noget med det sidet 0, 1) at gøre, hvis nej hvad betyder de så?

Og hvorfor skal den være ASC?
Avatar billede arne_v Ekspert
02. september 2012 - 21:59 #7
IF(opg=1, 0, 1) opretter en ny kolonne i outout som er 0 hvis opg=1 og ellers 1
Avatar billede arne_v Ekspert
02. september 2012 - 21:59 #8
Jeg forstaar ikke lige dine andre SUM.
Avatar billede Klaphattens Novice
02. september 2012 - 22:43 #9
Jeg synes måske det er lidt svært at forklare.
Men jeg prøver på denne måde.

1) Jeg vil gerne have den sortere efter point, med den der har flest point øverst. derfor:
SUM(point)

2) Hvis der er flere med samme point, vil jeg gerne have den sortere efter den med flest point i opgave 1 vil ligge øverst. derfor:
SUM(point) WHERE opg=1 DESC,

3) Hvis der er flere med samme total point og samme point i opgave 1, så skal den sortere efter differencen på SUM(point) og SUM(tab), så den med den største difference kommer øverst. derfor:
(SUM(point)-SUM(tab)) DESC,

4) Til sidst vil jeg gerne have, lavet det sådan, at hvis der er tilfælde hvor rækkefølgen af udtrækkene ikke er bestemt efter de 3 første situationer, så bliver det differencen på SUM(point) og SUM(tab) i opgave 1 der bestemmer hvem der er øverst. derfor:
(SUM(point)-SUM(tab)) WHERE opg=1 DESC
Avatar billede Klaphattens Novice
04. september 2012 - 22:27 #10
Jeg har selv fundet svaret:

[div]
...ORDER BY
SUM(point) DESC,
SUM(CASE WHEN opg=1 THEN point ELSE 0 END) DESC,
SUM(point-tab) DESC,
SUM(CASE WHEN opg=1 THEN point-tab ELSE 0 END) DESC
[div]

Arne -> dit svar var jo tildels også korrekt, så du må gerne smide et svar, ellers lukker jeg den selv om et par dage.
Avatar billede Klaphattens Novice
04. september 2012 - 22:28 #11
Hmmm fik ikke lukket div tagget. :oP
Avatar billede Klaphattens Novice
13. september 2012 - 10:58 #12
Lukker
Avatar billede arne_v Ekspert
16. september 2012 - 02:00 #13
Mit svar var vel 100% korrekt i forhold til det originale spoergsmaal.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester