SQL Server объединяет одни и те же данные категории - PullRequest
2 голосов
/ 16 мая 2019

Я использую SQL для моделирования данных с похожими категориями:

select TA.leaderCD, TA.EmpCD, TA.message
from  
    (select '1001' as EmpCD, 'L001' as leaderCD,'M1' as message
     union 
     select '1001','L002','M1'
     union 
     select '1001', 'L003','M1'
     union 
     select '1002', 'L001','M1'
     union 
     select '1002', 'L002','M2'
     union 
     select '1002', 'L004','M2'
     union 
     select '1003', 'L002','M1'
     union 
     select '1003', 'L003','M1'
     union 
     select '1003', 'L005','M2'
     union 
     select '1004', 'L002','M1'
     union 
     select '1004', 'L003','M2'
     union 
     select '1004', 'L004','M2'
     union 
     select '1004', 'L005','M3') as TA
order by 
    TA.leaderCD

Результат:

leaderCD EmpCD  message
L001     1001   M1
L001     1002   M1
L002     1001   M1
L002     1002   M2
L002     1003   M1
L002     1004   M1
L003     1001   M1
L003     1003   M1
L003     1004   M2
L004     1002   M2
L004     1004   M2
L005     1003   M2
L005     1004   M3

Я хочу разделить данные в соответствии с 1-м столбцом и 3-м столбцом.

Если 1-й столбец (leaderCD) и 3-й столбец (сообщение) содержат одинаковые данные, объедините 2-й столбец вместе, используйте точку с запятой, как показано ниже:

leaderCD EmpALL         message
L001     1001;1002      M1
L002     1001;1003;1004 M1
L002     1002           M2
L003     1001;1003      M1
L003     1004           M2
L004     1002;1004      M2
L005     1003           M2
L005     1004           M3

Я пыталсяГруппировать по, но я нахожу, что группа по не может это сделать.

Что мне делать?

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Я не уверен, что вы достаточно исследовали этот вопрос, но я включил потенциальное решение для вас.Вот это SQLFiddle .Код ниже:

SELECT EE.LeaderCD AS [Leader], EE.Message AS [Message], 
STUFF((SELECT ', ' + EmpCD 
       FROM Employees e 
       WHERE e.LeaderCD = ee.LeaderCD AND e.Message = ee.Message
       FOR XML PATH('')), 1, 1, '') AS [Employees]
FROM Employees ee
GROUP BY ee.LeaderCD, ee.Message

Способ работы этого кода, надеюсь, прост.STUFF - это функция SQL, которая, по сути, позволяет вам заменять текст в строке указанными параметрами start и stop.Это создает разделенный запятыми список (вы можете увидеть больше в этом здесь ) и затем присоединение его к основной таблице, когда идентификатор сотрудника и сообщение совпадают.Мы могли бы использовать выборочный элемент здесь, чтобы избежать дублирования, но я не думаю, что это будет необходимо из-за того, как мы строим строку.Для XML Path это другой фрагмент кода, который в основном создает XML-файл на основе результатов вашего запроса, и в этом случае при его использовании не создается путь (следовательно, пустая строка) - вы можете прочитать больше очто здесь .Я надеюсь, что это поможет, пожалуйста, дайте мне знать, если у вас есть другие вопросы.

1 голос
/ 16 мая 2019

Если вы используете SQL Server 2017, попробуйте это:

SELECT
    leadercd
    ,message
    ,STRING_AGG(empcd, ', ') AS e
FROM
    t
GROUP BY
    leadercd,message;

http://sqlfiddle.com/#!18/56434/17

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...