如何使用SELECT DISTINCT指定特定的自定义顺序

pmb*_*tin 2 t-sql sql-server

我已经看到了所有其他答案,但我还没有看到我的具体问题.基本上,我有一个包含大量重复值的表,我需要精确选择一列(连接到列表中,最终用于输出),但是该列表中的特定项目是FIRST.我遇到的问题是我可以指定顺序,或者我可以指定不同的,但不能同时指定两者.而且我不能包含SELECT中的order列,因为该输出将直接使用,并且输出中有两列会破坏所有内容.这似乎应该是可能的,但我无法弄清楚如何.

这是一个人为的例子:

DECLARE @List TABLE ([Name] nvarchar(10));
INSERT INTO @List ([Name])
VALUES (N'A'), (N'A'), (N'B'), (N'B'), (N'B'), (N'C'), (N'D'), (N'D'), (N'J'), (N'X'), (N'X'), (N'Y');

-- Has both duplicates, and not in the right order
SELECT * FROM @List;
-- No duplicates, but not in the right order
SELECT DISTINCT * FROM @List;
-- In the right order, but has duplicates
SELECT * FROM @List ORDER BY CASE WHEN [Name] = 'X' THEN '1' WHEN [Name] = 'Y' THEN '2' ELSE [Name] END;
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的简单输出:

X
Y
A
B
C
D
J
Run Code Online (Sandbox Code Playgroud)

我尝试了各种方法,CTE和中间步骤,但我真的只想要一个选择,我可以扔进一个STUFF,所以我得到字符串"X,Y,A,B,C,D,J" ,在这样做时,我找不到任何方法来保存所需的订单.这有可能,所以我显然遗漏了一些东西......

Sea*_*nge 5

您应该使用group而不是distinct.

SELECT [Name] 
FROM @List 
group by [Name]
ORDER BY CASE WHEN [Name] = 'X' THEN '1' WHEN [Name] = 'Y' THEN '2' ELSE [Name] END ;
Run Code Online (Sandbox Code Playgroud)