Avatar billede stephanryer Nybegynder
29. januar 2007 - 11:56 Der er 17 kommentarer og
2 løsninger

ORDER BY med CASE - genkender ikke kolonne

Jeg har et problem i en meget kompleks SP, så jeg har lavet en simpel query til at vise essensen af mit problem:

DECLARE @minvar INT
SET @minvar = 1

SELECT 2 AS kolonne
UNION
SELECT 1 AS kolonne

ORDER BY
(CASE @minvar
WHEN 1 THEN kolonne END)

Dette giver følgende fejlmeddelelse:

Msg 207, Level 16, State 3, Line 3
Invalid column name 'kolonne'.



Hvad er det jeg gør forkert?

På forhånd tak.
Avatar billede dr_chaos Nybegynder
29. januar 2007 - 13:11 #1
prøv med noget i denne stil:
DECLARE @SortOrder tinyint
SET @SortOrder = 2

SELECT CompanyName,
      ContactName,
      ContactTitle
FROM Customers
ORDER BY CASE WHEN @SortOrder = 1 THEN CompanyName
              WHEN @SortOrder = 2 THEN ContactName
              ELSE ContactTitle
        END
Avatar billede stephanryer Nybegynder
29. januar 2007 - 14:00 #2
DECLARE @minvar INT
SET @minvar = 1

SELECT 2 AS kolonne
UNION
SELECT 1 AS kolonne

ORDER BY CASE WHEN @minvar = 1
  THEN kolonne
ELSE
  kolonne
END

Nej, det giver stadig samme fejl :(
Avatar billede stephanryer Nybegynder
29. januar 2007 - 14:01 #3
Det er som om man ikke kan få lov at referere til sine kolonne-navne i en CASE.
Avatar billede dr_chaos Nybegynder
29. januar 2007 - 14:04 #4
Jo det kan du godt. du skal bare selecte fra en tabel. ellers kan du ikke lave en dynamisk order by.
Avatar billede dr_chaos Nybegynder
29. januar 2007 - 14:05 #5
Dette virker:
SELECT 2 AS kolonne
UNION
SELECT 1 AS kolonne
ORDER BY kolonne
Avatar billede dr_chaos Nybegynder
29. januar 2007 - 14:07 #6
Dette virker:
DECLARE @minvar INT
SET @minvar = 1

SELECT TOP 10 STAMDATA.ExpectFraportering as test FROM STAMDATA
ORDER BY CASE WHEN @minvar = 1
  THEN STAMDATA.ExpectFraportering
END

Dette virker ikke:
DECLARE @minvar INT
SET @minvar = 1

SELECT TOP 10 STAMDATA.ExpectFraportering as test FROM STAMDATA
ORDER BY CASE WHEN @minvar = 1
  THEN test
END
Avatar billede stephanryer Nybegynder
29. januar 2007 - 14:15 #7
jamen nu har jeg fx en kolonne der er resultatet af en aggregate function som jeg derfor har navngivet i min select. Kan man ikke lave en dynamisk ORDER BY kombineret med UNION og navngivet kolonne?
Avatar billede dr_chaos Nybegynder
29. januar 2007 - 14:16 #8
nej lader ikke til det.
prøv evt at bruge order by din agg function.
Avatar billede stephanryer Nybegynder
29. januar 2007 - 14:21 #9
jamen det blive en anelse ineffektivt at skulle fyre den af to gange.

Synes det er utroligt at man ikke kan gøre det.
Avatar billede dr_chaos Nybegynder
29. januar 2007 - 14:25 #10
Helt enig.
Måske kan du sorterer i dit dataset eller hvad du gemmer resultatet i.
Avatar billede teepee Nybegynder
29. januar 2007 - 14:26 #11
prøv at lave din order by udenom:

select * from (select ... union select...)
order by case...
Avatar billede stephanryer Nybegynder
29. januar 2007 - 14:32 #12
Lader ikke til at være muligt. Giver syntaks-fejl.

SELECT * FROM
(SELECT TOP 2 konmarkeringid, beskrivelse
FROM tskonmarkering)
ORDER BY konmarkeringid
Avatar billede dr_chaos Nybegynder
29. januar 2007 - 14:34 #13
SELECT * FROM
(SELECT TOP 2 konmarkeringid, beskrivelse
FROM tskonmarkering) X
ORDER BY X.konmarkeringid
Avatar billede stephanryer Nybegynder
29. januar 2007 - 14:40 #14
Kan ikke få det til at virke med min UNION.

(SELECT 1 AS kolonne
UNION
SELECT 2 AS kolonne) X
ORDER BY
CASE WHEN 1 = 1
THEN X.kolonne
ELSE
0
END
Avatar billede stephanryer Nybegynder
29. januar 2007 - 14:41 #15
Ok her var den:

SELECT * FROM (SELECT 1 AS kolonne
UNION
SELECT 2 AS kolonne) X
ORDER BY
CASE WHEN 1 = 1
THEN X.kolonne
ELSE
0
END

Takker. Læg et svar :)
Avatar billede dr_chaos Nybegynder
29. januar 2007 - 14:42 #16
Jeg tror teepee og jeg skal dele. Jeg byggede videre på hans svar.
Avatar billede stephanryer Nybegynder
29. januar 2007 - 16:00 #17
Fair nok - og god stil!
Avatar billede teepee Nybegynder
31. januar 2007 - 09:38 #18
Så lægger jeg lige et svar mere :-)
Avatar billede stephanryer Nybegynder
31. januar 2007 - 14:30 #19
:)
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