Получить уникальные значения из нескольких столбцов в одном запросе - PullRequest
0 голосов
/ 23 мая 2019

У меня есть данные сотрудника с несколькими столбцами. У меня есть 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 голосов
/ 24 мая 2019

До 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
...