Як зробити умовне замовлення для двох або більше стовпців


10

У MS SQL Server 2005 я пишу один запит із умовним сортуванням, і моя проблема полягає в тому, що я не знаю, як можна сортувати умовно за допомогою двох стовпців?

Якщо я написав такий код, він працює нормально

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

Я не знаю, як зробити умовне замовлення для двох або більше стовпців

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

Є ідея зробити динамічний TSQL та використовувати, sp_executesqlале я все ще шукаю кращої ідеї?



Ви також можете перевірити, чи є сенс мати CASE .. END в ЗАМОВЛЕННІ? . Хоча це питання було поставлено в контексті PostgreSQL, більшість коментарів та міркувань щодо динамічного запиту WRT vs CASEможуть бути застосовані до цього випадку.
joanolo

Відповіді:


12

Зізнаюся, мені ніколи раніше цього не доводилося робити, тому було трохи потертості голови. Простий приклад таблиці для демонстрації:

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

Використовуючи параметр @SortStyle для розмежування порядків сортування, @SortStyle = 1 буде сортувати за, col1 ASC, col2 DESCа @ SortStyle = 2 сортувати за 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

Як ви ЗАМОВИТИ за параметром охоплює простіший випадок сортування всього за 1 стовпцем.


5

Якщо припустити, що у вас більше випадків (я додав один), і всі типи сумісні,

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

Це не сортування з декількома стовпцями: у вас є первинний сорт, за яким йде вторинний сортування. Просто подивіться діалогове вікно сортування в Excel, щоб побачити, що я маю на увазі.


1

На прикладі, який ви даєте, це просто:

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

Є ідея зробити динамічний TSQL та використовувати, sp_executesqlале я все ще шукаю кращої ідеї.

Завжди приємно уникати динамічних SQL, де це можливо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.