In MS SQL Server 2005 schreibe ich eine Abfrage mit bedingter Sortierung und mein Problem ist, dass ich nicht weiß, wie ich bedingte Sortierung mit zwei Spalten durchführen kann.
Wenn ich solchen Code geschrieben habe, funktioniert er normal
select
*
from
table
order by
case @pkr
when 'kol' then kol
when 'nci' then nci
end
Ich weiß nicht, wie ich zwei oder mehr Spalten bedingt bestellen soll
select
*
from
table
order by
case @pkr
when 'KOL-NCI' then kol,nci
when 'kol-MPCI' then kol,mpci
end
Es gibt eine Idee, dynamisches TSQL zu erstellen und sp_executesql
Zu verwenden, aber ich suche immer noch nach einer besseren Idee?
Ich gebe zu, dass ich das noch nie zuvor machen musste, also war ein bisschen Kopfkratzen dabei. Einfache Beispieltabelle zur Demonstration:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND type in (N'U'))
DROP TABLE [dbo].[MyTable]
GO
CREATE TABLE dbo.MyTable
(
col1 INT
, col2 CHAR(1)
)
GO
INSERT dbo.MyTable (col1, col2) VALUES (1, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (1, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (1, 'C')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'C')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'C')
Bei Verwendung eines @ SortStyle-Parameters zur Unterscheidung zwischen Sortierreihenfolgen sortiert @SortStyle = 1 nach col1 ASC, col2 DESC
und @ SortStyle = 2 sortieren nach col2 DESC, col1 ASC
.
DECLARE @SortStyle INT
SET @SortStyle = 1
SELECT
col1
, col2
FROM
dbo.MyTable
ORDER BY
CASE
WHEN @SortStyle = 1 THEN col1
END ASC,
CASE
WHEN @SortStyle = 1 THEN col2
END DESC,
CASE
WHEN @SortStyle = 2 THEN col2
END DESC,
CASE
WHEN @SortStyle = 2 THEN col1
END ASC
SET @SortStyle = 2
SELECT
col1
, col2
FROM
dbo.MyTable
ORDER BY
CASE
WHEN @SortStyle = 1 THEN col1
END ASC,
CASE
WHEN @SortStyle = 1 THEN col2
END DESC,
CASE
WHEN @SortStyle = 2 THEN col2
END DESC,
CASE
WHEN @SortStyle = 2 THEN col1
END ASC
Wie ordnen Sie nach einem Parameter deckt den einfacheren Fall des Sortierens nach nur einer Spalte ab.
Angenommen, Sie haben mehr Fälle (ich habe einen hinzugefügt) und alle Typen sind kompatibel.
order by
case @pkr
when 'KOL-NCI' then kol
when 'kol-MPCI' then kol
when 'foo-bar' then foo
end,
case @pkr
when 'KOL-NCI' then nci
when 'kol-MPCI' then mpci
when 'foo-bar' then bar
end
Es ist keine mehrspaltige Sortierung: Sie haben eine primäre Sortierung, gefolgt von einer sekundären Sortierung. Schauen Sie sich einfach das Sortierdialogfeld in Excel an, um zu sehen, was ich meine.
Mit dem Beispiel, das Sie geben, ist es einfach:
select *
from table
order by kol, case @pkr
when 'KOL-NCI' then nci
when 'kol-MPCI' then mpci
end
Es gibt eine Idee, dynamisches TSQL zu erstellen und
sp_executesql
Zu verwenden, aber ich suche immer noch nach einer besseren Idee.
Es ist immer schön, dynamisches SQL nach Möglichkeit zu vermeiden