SQL-запрос для получения столбца, разделенного запятой, из избыточных строк?

#sql #select #group-by #sql-server-2012 #sql-server-group-concat

#sql #выберите #группировка по #sql-server-2012 #sql-server-group-concat

Вопрос:

У меня есть две таблицы, которые объединены и сохранены во временной таблице.

Временная таблица содержит данные в следующем виде:

 |ID|Name |Code|  
|1 | 100 |AAAA|
|1 | 100 |AAAB|
|1 | 100 |AAAA|
|2 | 200 |AAAZ|
more...
  

Теперь я хочу получить результат в следующей форме,

 ╔════╦═════════════════════╗
║ ID ║ Name ║   Code       ║
╠════╬═════════════════════╣
║  1100  ║   AAAA, AAAB ║
║  2200  ║   AAAZ       ║
╚════╩═════════════════════╝
  

Итак, я написал следующий запрос, который выдает аналогичный результат, поэтому мой вопрос заключается в том, есть ли какой-либо другой способ добиться этого.

 SELECT Distinct BSE_ID
    ,BSE_Name
    ,STUFF((
            SELECT ', '   CAST(EBS_ExternalCode AS VARCHAR(100)) [text()]
            FROM #tmpBkgSvc
            WHERE BSE_ID = T.BSE_ID
            FOR XML PATH('')
                ,TYPE
            ).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ') EBS_ExternalCode
FROM #tmpBkgSvc T
  

Комментарии:

1. Какую БД вы используете? Это MySQL?

2. Я использую Sql_Server…

Ответ №1:

Попробуйте это

 Create function Fun
(
    @id int, @name varchar(100)
)
returns varchar(max)
as
begin 

       Declare @code varchar(max)
       Select @code = isnull(@code ',','') s.code
       from (Select distinct code 
              from table 
               where name = @name and id = @id) s
       Return @code
end

Select id,name,[dbo].Fun(id,Name) 'Code' from table group by id,name
  

Ответ №2:

попробуйте так, Use group By In the Code column

 SELECT Distinct ID, Name
    ,STUFF((
            SELECT ', '   CAST(Code AS VARCHAR(100)) [text()]
            FROM DataTable
            WHERE ID = T.ID Group By Code //group by does the magic here
            FOR XML PATH('')
                ,TYPE
            ).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ') Code 
FROM DataTable T
  

Ответ №3:

Используйте перекрестное применение вместо вложенного запроса

 SELECT T.BSE_ID, T.NAME, MAX(STUFF(A.BSE_ID_LIST, 1, 1, '')) AS BSE_ID_LIST
FROM #tmpBkgSvc T
CROSS APPLY (
    SELECT ', '   CAST(EBS_ExternalCode AS VARCHAR(100))
    FROM #tmpBkgSvc T1
    WHERE T1.BSE_ID = T.BSE_ID
    GROUP BY T1.EBS_ExternalCode 
    ORDER BY T1.EBS_ExternalCode 
    FOR XML PATH('')
) AS A (BSE_ID_LIST)
GROUP BY T.BSE_ID, T.NAME