Получить уникальные значения из нескольких столбцов в одном запросе

У меня есть данные о сотруднике с несколькими столбцами. У меня есть WebAPI, который считывает данные из этой базы данных для поискового приложения, которое выводит пользователей. Мне нужно получить список уникальных значений для 4 полей. Я надеюсь сделать это в одном запросе, если это возможно.

У меня более 25 столбцов, но мне нужны уникальные значения для 4 столбцов (должность, отдел, должность, группа). Мне просто нужно, чтобы они возвращались в виде списка, разделенного запятыми.

Пример таблицы 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

person Kameron    schedule 23.05.2019    source источник
comment
Обновлено (SQL Server 2016)   -  person Kameron    schedule 24.05.2019


Ответы (1)


До 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
person mkRabbani    schedule 24.05.2019
comment
Это круто! Работал отлично! - person Kameron; 24.05.2019