Come rendere l'ordinazione condizionale per due o più colonne
-
16-10-2019 - |
Domanda
In MS SQL Server 2005 Sto scrivendo una query con tipo condizionale e il mio problema è che non so come posso sorta condizionale mediante due colonne?
Se ho scritto il codice come questo si sta lavorando normalmente
select
*
from
table
order by
case @pkr
when 'kol' then kol
when 'nci' then nci
end
Non so come fare l'ordinazione condizionale per due o più colonne
select
*
from
table
order by
case @pkr
when 'KOL-NCI' then kol,nci
when 'kol-MPCI' then kol,mpci
end
C'è un'idea per rendere dinamico TSQL e l'uso sp_executesql
ma sono ancora alla ricerca di una migliore idea?
Soluzione
Devo ammettere che ho mai dovuto farlo prima, quindi c'era un po 'di testa graffi coinvolto. tavolo semplice esempio per dimostrare:
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')
Utilizzando un parametro @SortStyle di differenziare tra ordinamento, @SortStyle = 1 ordinerà da col1 ASC, col2 DESC
e @ SortStyle = 2 mostra per 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
Come si fa a ORDER BY un parametro copre il caso più semplice di ordinamento per solo 1 colonna.
Altri suggerimenti
Supponendo di avere più casi (ho aggiunto uno), e di tutti i tipi sono compatibili,
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
Non è una specie a più colonne: si dispone di una sorta primaria, seguita da una sorta secondario. Basta guardare la finestra di dialogo ordinamento in Excel per capire cosa intendo.
Con l'esempio si dà è semplice:
select *
from table
order by kol, case @pkr
when 'KOL-NCI' then nci
when 'kol-MPCI' then mpci
end
C'è un'idea per rendere dinamico TSQL e l'uso
sp_executesql
, ma io sono ancora loking per una migliore idea.
E 'sempre bello per evitare SQL dinamico, ove possibile,