webForumDet fria alternativet

Sortera efter flera fält med case

Databaser & SQL

20 svar · 536 visningar · startad av Glitter

Medlem sedan juli 2003465 inlägg
Frågan#1

Hej

Jar har en SQL fråga:
SELECT *
FROM karta
WHERE (forsamlingskod IS NULL)
ORDER BY lankod, CASE WHEN kommunkod IS NOT NULL THEN 1 ELSE 0 END, Namn

Funkar nästan bra...
Denna sorterar efter kommuner i bokstavsårdning efter länen men jag vill ha länen i bokstavsårdning med.
just nu är de sorterade i lankod.

Man vet att det är ett län p.g att kommunkod är null. kommunkod innehåller värde på både lankod och kommunkod.

Kör SQL 2000 Server

Medlem sedan dec. 1999707 inlägg
#2

Hmm, är det inte bara att ta bort "lankod" i ORDER BY?

Medlem sedan juli 2003465 inlägg
#3

nepp då får jag alla län överst...

Medlem sedan dec. 200012 464 inlägg
#4

Var har du länsnamn lagrade då?

Medlem sedan juli 2003465 inlägg
#5

länsnamnen ligger i namn columnen tilsammans med kommun namnen...

Medlem sedan dec. 1999707 inlägg
#6

Hur blir det om du gör nåt sånt här?

SELECT
	lankod,
	lan.namn		AS LanNamn,
	kommunkod,
	namn			AS KommunNamn
FROM
	karta
	inner join
	karta lan
	ON
	lan.lankod = karta.lankod
	and
	karta.kommunkod IS NULL
WHERE
	forsamlingskod IS NULL

ORDER BY
	LanNamn,
	CASE WHEN kommunkod IS NOT NULL THEN 1 ELSE 0 END,
	KommunNamn
Medlem sedan juli 2003465 inlägg
#7

asså det är samma tabell som alt ligger i...

Medlem sedan dec. 200012 464 inlägg
#8

Vad betyder tillsammans med?

Kan du exemplifiera med datainnehåll?

Medlem sedan dec. 1999707 inlägg
#9

asså det är samma tabell som alt ligger i...

Jo, men om du ser så är lan-tabellen bara en alias; en inner join med sig själv för att få med lännamn för resp. kommun.

FROM
	karta
	inner join
	[b]karta lan[/b]
	ON
	lan.lankod = karta.lankod
	and
	karta.kommunkod IS NULL
Medlem sedan juli 2003465 inlägg
#10

toha: det går inte får massa dubletter...

LarsG skrev:

Vad betyder tillsammans med?

Kan du exemplifiera med datainnehåll?

Namn                 |Kommunkod|Lankod
STOCKHOLMS LÄN       |NULL     |1
BOTKYRKA             |27       |1
DANDERYD             |62       |1
VÄSTRA GÖTALANDS LÄN |NULL     |14
ALE                  |40       |14
ALINGSÅS             |89       |14
Medlem sedan nov. 20017 144 inlägg
#11
SELECT
	distinct(lankod) ,
...

?

Medlem sedan juli 2003465 inlägg
#12

Går inte eftersom kommunkod innehåller samma lankod som länet som de ligger under

Medlem sedan dec. 1999707 inlägg
#13

Den här då? :)

SELECT
	lan.lankod,
	lan.namn			AS LanNamn,
	karta.kommunkod,
	karta.namn			AS KommunNamn
FROM
	karta

	LEFT OUTER JOIN
	karta lan
	ON
	lan.lankod = karta.lankod
	and
	lan.kommunkod IS NULL

WHERE
	karta.kommunkod IS NOT NULL

UNION

SELECT
	karta.lankod,
	karta.namn,
	null,
	null
FROM
	karta
WHERE
	karta.kommunkod IS NULL

ORDER BY
	LanNamn,
	KommunNamn
Medlem sedan juli 2003465 inlägg
#14

Det funkar ju men blir det inte onödligt mycket information och segt?
Skall vara så optimalt som möjligt.
Annars så kan jag sätta 2 loppar i varandra för att loppa ut det på sidan som jag gjorde från början.

Medlem sedan dec. 1999707 inlägg
#15

Det går ju garanterat snabbare att låta databasen returnera det korrekt än att loopa igenom ett resultat och villkorskontrollera varje rad.

Vad har du för index på tabellen?

Medlem sedan juli 2003465 inlägg
#16

inga i nuläget... men skall fixa det så småningom...
några förslag på indexering för bästa resultat?

Medlem sedan dec. 1999707 inlägg
#17

Med det uttrycket så tror jag det ska räcka om du skapar ETT kombinerat index på kolumnerna:

kommunkod,
lankod,
namn

Medlem sedan dec. 1999707 inlägg
#18

En liten rättning i uttrycket: Kör en UNION ALL, blir lite snabbare så om du är orolig för prestandan. Funkar i det här fallet.

Medlem sedan juli 2003465 inlägg
#19

Hur gör man denna till en view i databasen?
För det är la det bästa sättet för prestanda om det inte skall ändras något i databasen och uthämtningen?
får fel på ORDER BY och Union mär jag skall spara...

Medlem sedan dec. 1999707 inlägg
#20

Du tjänar ingen prestanda på att skapa en vy av det. I en vy kan man inte ange ORDER BY. Det får man göra när man gör en select utifrån vyn. Jag skulle skapat en SP för det.

CREATE PROCEDURE proc_getLanKommunOrdered
AS

    SELECT ........

GO
257 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)