it-swarm-eu.dev

Jak provést podmíněné uspořádání pro dva nebo více sloupců

V MS SQL Server 2005 píšu jeden dotaz s podmíněným tříděním a mým problémem je, že nevím, jak mohu třídit podmíněně pomocí dvou sloupců?

Pokud jsem napsal kód, jako je tento, funguje to normálně

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

Nevím, jak provést podmíněné objednání pro dva nebo více sloupců

select
    *
from 
    table
order by 
    case @pkr
        when 'KOL-NCI' then kol,nci
        when 'kol-MPCI' then kol,mpci
    end

Existuje nápad vytvořit dynamickou TSQL a použít sp_executesql ale stále hledám lepší nápad?

10
adopilot

Přiznávám, že jsem to nikdy předtím neudělal, takže došlo k trochu poškrábání hlavy. Jednoduchá ukázková tabulka, která demonstruje:

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')

Pomocí parametru @SortStyle k rozlišení objednávek řazení se @SortStyle = 1 třídí podle col1 ASC, col2 DESC a @ SortStyle = 2 seřadit podle 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

Jak se OBJEDNÁVÁTE parametrem pokrývá jednodušší případ třídění podle 1 sloupce.

12
Mark Storey-Smith

Za předpokladu, že máte více případů (přidal jsem jeden) a všechny typy jsou kompatibilní,

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

Nejedná se o vícesloupcové řazení: máte primární řazení následované sekundárním uspořádáním. Stačí se podívat na třídicí dialogové okno v Excelu a zjistit, co tím myslím.

5
gbn

Na příkladu je to jednoduché:

select *
from table
order by kol, case @pkr
                when 'KOL-NCI' then nci
                when 'kol-MPCI' then mpci
              end

Existuje nápad vytvořit dynamickou TSQL a použít sp_executesql ale stále hledám lepší nápad.

Vždy je příjemné vyhnout se dynamickému SQL, je-li to možné