在单个请求中从多个列获取唯一值

时间:2019-05-23 20:49:42

标签: sql sql-server tsql distinct-values string-aggregation

我有几列员工数据。我有一个WebAPI正在从此数据库中读取显示用户的搜索应用程序。我需要获取4个字段的唯一值的列表。我希望在单个查询中做到这一点。

我有25列以上,但我需要4列(JobTitle,Department,Position,Group)的唯一值。我只需要它们以逗号分隔的列表形式返回。

示例SQL Server 2016表:

  Name | JobTitle |  Department  |  Position  |  Group  
 ------|----------|--------------|------------|--------- 
  John |  Partner |  Department1 |  Position1 |  Group1 
  Jane |  Manager |  Department2 |  Position2 |  Group2 
  Joe  |  Analyst |  Department2 |  Position2 |  Group2 

我希望我的结果是一行,并用逗号分隔唯一值的列表:

返回单行

Departments: Department1,Department2
JobTitles: Partner,Manager,Analyst
Positions: Position1,Position2
Groups: Group1, Group2

1 个答案:

答案 0 :(得分:0)

在SQL Server 2016之前,您可以使用STUFF将另一行中的STRING连接到一个用逗号分隔符的行/列中。以下脚本将根据您的要求返回DISTINCT值的列表-

SELECT DISTINCT
STUFF((SELECT DISTINCT  ',' + A.JobTitle FROM Employee A FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') JobTitle, 
STUFF((SELECT DISTINCT  ',' + A.Department FROM Employee A FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') Department,
STUFF((SELECT DISTINCT  ',' + A.Position FROM Employee A FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') Position,
STUFF((SELECT DISTINCT  ',' + A.[Group] FROM Employee A FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') [Group]
FROM Employee A

如果要在不同值列表之前添加标签,请使用以下脚本-

SELECT 
'JobTitles: ' + B.JobTitle AS  JobTitle,
'Departments: ' + B.Department AS  Department,
'Positions: ' + B.Position AS  Position,
'Groups: ' + B.[Group] AS  [Group]
FROM
(
    SELECT DISTINCT
    STUFF((SELECT DISTINCT  ',' + A.JobTitle FROM Employee A FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') JobTitle, 
    STUFF((SELECT DISTINCT  ',' + A.Department FROM Employee A FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') Department,
    STUFF((SELECT DISTINCT  ',' + A.Position FROM Employee A FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') Position,
    STUFF((SELECT DISTINCT  ',' + A.[Group] FROM Employee A FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') [Group]
    FROM Employee A
)B
相关问题