webForumDet fria alternativet

Sortera efter flera fält med case

20 svar · 536 visningar · startad av Glitter

GlitterMedlem sedan juli 2003465 inlägg
#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

tohaMedlem sedan dec. 1999707 inlägg
#2

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

GlitterMedlem sedan juli 2003465 inlägg
#3

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

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Var har du länsnamn lagrade då?

GlitterMedlem sedan juli 2003465 inlägg
#5

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

tohaMedlem 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
GlitterMedlem sedan juli 2003465 inlägg
#7

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

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Vad betyder tillsammans med?

Kan du exemplifiera med datainnehåll?

tohaMedlem 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
GlitterMedlem 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
Jesper TMedlem sedan nov. 20017 144 inlägg
#11
SELECT
	distinct(lankod) ,
...

?

GlitterMedlem sedan juli 2003465 inlägg
#12

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

tohaMedlem 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
GlitterMedlem 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.

tohaMedlem 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?

GlitterMedlem 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?

tohaMedlem 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

tohaMedlem 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.

GlitterMedlem 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...

tohaMedlem 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
135 ms totalt · 3 externa anrop · v20260731065814-full.102f7fcd
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)