#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 ║
╠════╬═════════════════════╣
║ 1 ║ 100 ║ AAAA, AAAB ║
║ 2 ║ 200 ║ 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