MS SQL Server 2005では、条件付き並べ替えを使用して1つのクエリを作成していますが、2つの列を使用して条件付き並べ替えを行う方法がわかりません。
私がこのようなコードを書いた場合、それは正常に動作しています
select
*
from
table
order by
case @pkr
when 'kol' then kol
when 'nci' then nci
end
2つ以上の列の条件付き順序を作成する方法がわかりません
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する方法 は、1列だけでソートする単純なケースをカバーしています。
より多くのケースがあり(1つ追加した)、すべてのタイプに互換性があると仮定すると、
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
これは複数列の並べ替えではありません。1次並べ替えの後に2次並べ替えがあります。 Excelの並べ替えダイアログボックスを見て、どういう意味かを確認してください。
あなたが与える例ではそれは簡単です:
select *
from table
order by kol, case @pkr
when 'KOL-NCI' then nci
when 'kol-MPCI' then mpci
end
動的TSQLを作成して
sp_executesql
を使用するというアイデアはありますが、まだより良いアイデアを探しています。
可能な場合は常に動的SQLを避けた方がいい