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?

È stato utile?

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,

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top