둘 이상의 열에 대해 조건부 순서를 만드는 방법


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가 ORDER BY에있는 것이 의미가 있습니까? 를 확인할 수도 있습니다 . . 이 질문은 PostgreSQL의 맥락에서 제기되었지만 WRT 동적 쿼리 대 주석 및 고려 사항의 대부분은 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

매개 변수 를 정렬하는 방법은 단 하나의 열로 정렬하는 간단한 경우를 다룹니다.


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을 피하는 것이 좋습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.