SQL Server объединяет несколько строк по группам, используя FOR XML PATH - PullRequest
4 голосов
/ 23 сентября 2019

У меня есть таблица с именем findhighest_secondstep с такими данными:

id  department  top_employee    highest_salary  rownumber1
-----------------------------------------------------------
 5  Finance         Shane           6300            1
10  Finance         Laura           6300            1
 7  HR              Vik             7200            1
 3  IT              Kate            7500            1
14  Marketing       Elice           6800            1
 6  Sales           Shed            8000            1

Я хочу вернуть таблицу со столбцами департамента, top_employee и самая высокая_сальская, хотя я знаю, что в финансовом отделе у нас есть 2 человека стакая же зарплата.Поэтому я хочу показать все из них.

SELECT 
    hs.department AS department,
    top_employee = STUFF((SELECT ', ' + top_employee
                          FROM findhighest_secondstep 
                          FOR XML PATH('')), 1, 1, '')                   
FROM 
    findhighest_secondstep hs
GROUP BY 
    hs.department

Вот что я получил:

department    top_employee
--------------------------------------------------
Finance       Shane, Laura, Vik, Kate, Elice, Shed
HR            Shane, Laura, Vik, Kate, Elice, Shed
IT            Shane, Laura, Vik, Kate, Elice, Shed
Marketing     Shane, Laura, Vik, Kate, Elice, Shed
Sales         Shane, Laura, Vik, Kate, Elice, Shed

Что я хочу:

department  top_employee    highest_salary
---------------------------------------------
Finance     Shane, Laura    6300
HR          Vik             7200
IT          Kate            7500
Marketing   Elice           6800
Sales       Shed            8000

Ответы [ 3 ]

6 голосов
/ 23 сентября 2019

Вам нужен коррелированный подзапрос:

SELECT hs.department AS department,
       STUFF( (SELECT ', ' + top_employee
               FROM findhighest_secondstep hs2
               WHERE hs2.department = hs.department
               FOR XML PATH('')
              ), 1, 2, ''
            ) as top_employees                   
FROM findhighest_secondstep hs
GROUP BY hs.department
0 голосов
/ 23 сентября 2019

Мы можем попытаться использовать STRING_AGG здесь, так как вы используете SQL Server 2017:

WITH cte AS (
    SELECT *, RANK() OVER (PARTITION BY department ORDER BY highest_salary DESC) rnk
    FROM findhighest_secondstep
)

SELECT
    department,
    STRING_AGG(top_employee, ',') AS top_employee,
    MAX(highest_salary) AS highest_salaray
FROM cte
WHERE
    rnk = 1
GROUP BY
    department;

Логика здесь в том, что мы присваиваем звание 1 каждому сотруднику в данном отделе, который имеетсамая высокая зарплата.Затем мы агрегируем по отделам, получая список CSV всех сотрудников, занявших первое место, вместе с самой высокой зарплатой.

0 голосов
/ 23 сентября 2019

Вы можете использовать STRING_AGG .Как то так:

SELECT department
      ,top_employee    
      ,STRING_AGG(highest_salary, ',')
FROM findhighest_secondstep 
GROUP BY department
        ,highest_salary
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...