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
있지만 여전히 더 나은 아이디어를 찾고 있습니까?
답변
이 작업을 수행 한 적이 없어서 약간의 머리 긁힘이 발생했음을 인정합니다. 간단한 예제 테이블 :
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
매개 변수 를 정렬하는 방법은 단 하나의 열로 정렬하는 간단한 경우를 다룹니다.
답변
더 많은 사례가 있다고 가정하고 (하나를 추가했습니다) 모든 유형이 호환 가능합니다.
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에서 정렬 대화 상자를 보면 의미하는 바를 확인할 수 있습니다.
답변
예제를 통해 간단하게 알 수 있습니다.
select *
from table
order by kol, case @pkr
when 'KOL-NCI' then nci
when 'kol-MPCI' then mpci
end
동적 TSQL을 만들고 사용하는 아이디어가
sp_executesql
있지만 여전히 더 나은 아이디어를 찾고 있습니다.
가능하면 항상 동적 SQL을 피하는 것이 좋습니다