Come effettuare l'ordinamento condizionale per due o più colonne


10

In MS SQL Server 2005 sto scrivendo una query con ordinamento condizionale e il mio problema è che non so come posso ordinare condizionale utilizzando due colonne?

Se ho scritto codice in questo modo, funziona normalmente

select
    *
from 
    table
order by 
    case @pkr 
           when 'kol' then kol
           when 'nci' then nci
    end

Non so come effettuare l'ordinamento 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 TSQL dinamico e usare sp_executesqlma sto ancora cercando un'idea migliore?



Puoi anche controllare Ha senso avere CASE .. END in un ORDER BY? . Sebbene questa domanda sia stata posta nel contesto di PostgreSQL, la maggior parte dei commenti e delle considerazioni sulla query dinamica WRT vs CASEpuò essere applicabile a questo caso.
joanolo

Risposte:


12

Devo ammettere che non ho mai dovuto farlo prima, quindi c'era un po 'di grattarsi la testa. Tabella di esempio semplice 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 per differenziare gli ordinamenti, @SortStyle = 1 ordina per col1 ASC, col2 DESCe @ SortStyle = 2 ordina 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

In che modo ORDER BY un parametro copre il caso più semplice di ordinamento di una sola colonna.


5

Supponendo che tu abbia più casi (ne ho aggiunto uno) e 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 è un ordinamento a più colonne: hai un ordinamento primario, seguito da un ordinamento secondario. Basta guardare la finestra di dialogo di ordinamento in Excel per vedere cosa intendo.


1

Con l'esempio che dai è 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 TSQL dinamico e usare, sp_executesqlma sto ancora cercando un'idea migliore.

È sempre bello evitare l'SQL dinamico ove possibile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.