Permalänk
Medlem

Sortering i SQL

Har inte arbetat med SQL på mycket länge, så känner mig ganska rostig. Efter några misslyckade försök så ber jag därför ödmjukast om hjälp.

Jag har en tabell som innehåller fälten "företag", "säljare" och "antal sålda enheter" (nåja, egentligen är fälten "ext_ref", "hnd", "no_dg", men jag tror det blir enklare med de förstnämnda).

Säljarna inom varje företag skall sorteras efter antalet sålda enheter (sjunkande), och sedan skall företagens inbördes ordning baseras på antalet sålda enheter hos sin toppsäljare (sjunkande).

Exempel:

FöretagA Säljare1 50
FöretagB Säljare7 100
FöretagA Säljare8 120
FöretagC Säljare43 150
FöretagC Säljare14 75
FöretagB Säljare3 90
FöretagA Säljare14 65

Skall ge resultatet:

FöretagC Säljare43 150
FöretagC Säljare14 75
FöretagA Säljare8 120
FöretagA Säljare14 65
FöretagA Säljare1 50
FöretagB Säljare7 100
FöretagB Säljare3 90

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem

@PeCe:Kolla här w3schools

Visa signatur

- none -

Permalänk
Medlem

Prova följande:

SELECT * FROM tabel ORDER BY företag, fält;

https://stackoverflow.com/questions/2051162/sql-multiple-column-ordering

Permalänk
Medlem

SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC;

Det viktiga är att sätta ASC eller DESC rätt för att få ordningen tillsammans med rätt fråga. se exempel ovan.

Visa signatur

got root?

Permalänk
Medlem

Order by Företag (ASC), Antal sålda enheter (DESC) ger:

FöretagA Säljare8 120
FöretagA Säljare14 65
FöretagA Säljare1 50
FöretagB Säljare7 100
FöretagB Säljare3 90
FöretagC Säljare43 150
FöretagC Säljare14 75

Företagen är alltså sorterade i bokstavsordning, inte efter antal sålda enheter av sin toppsäljare.

---

Order by Antal sålda enheter (DESC), Företag (ASC) ger:

FöretagC Säljare43 150
FöretagA Säljare8 120
FöretagB Säljare7 100
FöretagB Säljare3 90
FöretagC Säljare14 75
FöretagA Säljare14 65
FöretagA Säljare1 50

Alltså en lista sorterad efter antal sålda enheter. Det enda sorteringen på företag bidrar med är bokstavsordning i företagskolumnen om flera säljare sålt samma antal enheter.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem

Du kan först göra ett urval på tabellen där du summerar och sorterar företagen efter totalt sålda enheter, därefter joinar du tabellen med sig själv och väljer vilka fält du vill ha med.

Något i stil med

SELECT Fsl2.Företag, Fsl2.Säljare, Fsl2.Enheter
FROM Försäljning AS Fsl1 INNER JOIN Försäljning AS Fsl2 ON Fsl1.Företag = Fsl2.Företag
GROUP BY Fsl2.Företag, Fsl2.Säljare, Fsl2.Enheter, Fsl1.Företag
ORDER BY Sum(Fsl1.Enheter) DESC;

I detta fallet heter tabellen med informationen i Försäljning där vi i Fsl1 summerar ihop och grupperar ihop försäljning på varje företag, därefter joinar vi med Fsl2 där vi väljer fälten vi vill få ut.

Ursprung
Företag Säljare Enheter
Företag A Säljare A 5
Företag C Säljare B 86
Företag B Säljare A 7
Företag D Säljare C 77
Företag C Säljare A 43
Företag A Säljare B 65
Företag D Säljare C 43
Företag B Säljare C 56

Resultat
Företag Säljare Enheter
Företag C Säljare B 86
Företag C Säljare A 43
Företag D Säljare C 77
Företag D Säljare C 43
Företag A Säljare B 65
Företag A Säljare A 5
Företag B Säljare C 56
Företag B Säljare A 7

Visa signatur

There are 10 types of people in the world: Those who understand binary, and those who don't...

Asus Maximus VIII Hero | i7-6700K | ASUS GeForce GTX1070 Strix 8GB | G.Skill F4-2133C15Q-32GRK |

Permalänk
Medlem
Skrivet av WarWolf.667:

Funkade perfekt. Stort tack!

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem

Det finns ett enklare sätt, åtminstone i T-SQL (vet inte om det går i andra dialekter).

SELECT * FROM Försäljning ORDER BY MAX(Enheter) OVER(PARTITION BY Företag) DESC, Enheter DESC;

Färre tecken att skriva.

Sen finns det ett litet fel i den andra lösningen, det ha använts SUM istället för MAX vilket kommer sortera företagen på totalt antal sålda enheter per företaget istället för efterfrågade antalet sålda enheter hos företagets toppsäljare.

Permalänk
Medlem

Du verkar redan ha fått ditt svar, men jag är nyfiken på en grej. Vad är de verkliga kolumnnamnen förkortningar för? Jag gissar att "ext_ref" står för "External reference" och "hnd" för "Handler". Det känns ganska rimligt. Jag har dock svårt att gissa vad "no_dg" skulle kunna stå för. "Number Of ...". "Delivered Goods"?

Visa signatur

Arbets- / Spelstation: Arch Linux - Ryzen 5 3600 - RX 7900 XT - 32G DDR4
Server: Arch Linux - Core i5-10400F - 16G DDR4

Permalänk
Medlem
Skrivet av Bryal:

Du verkar redan ha fått ditt svar, men jag är nyfiken på en grej. Vad är de verkliga kolumnnamnen förkortningar för? Jag gissar att "ext_ref" står för "External reference" och "hnd" för "Handler". Det känns ganska rimligt. Jag har dock svårt att gissa vad "no_dg" skulle kunna stå för. "Number Of ...". "Delivered Goods"?

Number of data groups.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk
Medlem
Skrivet av johho:

Det finns ett enklare sätt, åtminstone i T-SQL (vet inte om det går i andra dialekter).

SELECT * FROM Försäljning ORDER BY MAX(Enheter) OVER(PARTITION BY Företag) DESC, Enheter DESC;

Färre tecken att skriva.

Sen finns det ett litet fel i den andra lösningen, det ha använts SUM istället för MAX vilket kommer sortera företagen på totalt antal sålda enheter per företaget istället för efterfrågade antalet sålda enheter hos företagets toppsäljare.

johho har helt rätt, det skall vara MAX istället för SUM om det skall vara efter toppförsäljning från enskild säljare inte totalt sålt till företaget. Dessutom är det helt klart smidigare med OVER. Sitter och kör pervasive för tillfället så då är det inte ett alternativ tyvärr

Visa signatur

There are 10 types of people in the world: Those who understand binary, and those who don't...

Asus Maximus VIII Hero | i7-6700K | ASUS GeForce GTX1070 Strix 8GB | G.Skill F4-2133C15Q-32GRK |