Как получить значения столбца в одном значении, разделенном запятой
У меня есть таблица, которая содержит строки, как показано ниже
ID User Department
1 User1 Admin
2 User1 Accounts
3 User2 Finance
4 User3 Sales
5 User3 Finance
Мне нужен запрос select, который выводит следующий формат
ID User Department
1 User1 Admin,Accounts
2 User2 Finance
3 User3 Sales, Finance
Ответы
Ответ 1
Вы пометили вопрос с помощью sql-server и plsql, поэтому я предоставлю ответы как для SQL Server, так и для Oracle.
В SQL Server вы можете использовать FOR XML PATH
для объединения нескольких строк:
select distinct t.[user],
STUFF((SELECT distinct ', ' + t1.department
from yourtable t1
where t.[user] = t1.[user]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,2,'') department
from yourtable t;
Смотрите SQL Fiddle с демонстрацией.
В Oracle 11g+ вы можете использовать LISTAGG
:
select "User",
listagg(department, ',') within group (order by "User") as departments
from yourtable
group by "User"
Смотрите SQL Fiddle с демо
До Oracle 11g вы могли использовать функцию wm_concat
:
select "User",
wm_concat(department) departments
from yourtable
group by "User"
Ответ 2
В Sql Server вы можете использовать его.
DECLARE @UserMaster TABLE(
UserID INT NOT NULL,
UserName varchar(30) NOT NULL
);
INSERT INTO @UserMaster VALUES (1,'Rakesh')
INSERT INTO @UserMaster VALUES (2,'Ashish')
INSERT INTO @UserMaster VALUES (3,'Sagar')
SELECT * FROM @UserMaster
DECLARE @CSV VARCHAR(MAX)
SELECT @CSV = COALESCE(@CSV + ', ', '') + UserName from @UserMaster
SELECT @CSV AS Result
Ответ 3
MYSQL: для получения значений столбцов как одного значения, разделенного запятой, используйте GROUP_CONCAT( )
функцию как
GROUP_CONCAT( `column_name` )
например
SELECT GROUP_CONCAT( `column_name` )
FROM `table_name`
WHERE 1
LIMIT 0 , 30
Ответ 4
Вы можете сделать это со следующим SQL:
SELECT STUFF
(
(
SELECT ',' + s.FirstName
FROM Employee s
ORDER BY s.FirstName FOR XML PATH('')
),
1, 1, ''
) AS Employees
Ответ 5
Для Mysql:
SELECT t.user,
(SELECT GROUP_CONCAT( t1.department ) FROM table_name t1 WHERE t1.user = t.user)department
FROM table_name t
GROUP BY t.user
LIMIT 0 , 30
Ответ 6
SELECT name, GROUP_CONCAT( section )
FROM `tmp`
GROUP BY name
Ответ 7
Попробуйте выполнить следующий запрос:
select distinct Users,
STUFF(
(
select ', ' + d.Department FROM @temp d
where t.Users=d.Users
group by d.Department for xml path('')
), 1, 2, '') as Departments
from @temp t
Реализация:
Declare @temp Table(
ID int,
Users varchar(50),
Department varchar(50)
)
insert into @temp
(ID,Users,Department)
values
(1,'User1','Admin')
insert into @temp
(ID,Users,Department)
values
(2,'User1','Accounts')
insert into @temp
(ID,Users,Department)
values
(3,'User2','Finance')
insert into @temp
(ID,Users,Department)
values
(4,'User3','Sales')
insert into @temp
(ID,Users,Department)
values
(5,'User3','Finance')
select distinct Users,
STUFF(
(
select ', ' + d.Department FROM @temp d
where t.Users=d.Users
group by d.Department for xml path('')
), 1, 2, '') as Departments
from @temp t
Результат будет:
![введите описание изображения здесь]()
Ответ 8
Для версий Oracle, которые не поддерживают WM_CONCAT, можно использовать
select "User", RTRIM(
XMLAGG (XMLELEMENT(e, department||',') ORDER BY department).EXTRACT('//text()') , ','
) AS departments
from yourtable
group by "User"
Этот файл намного более мощный и гибкий - вы можете указать как разделители, так и порядок сортировки в каждой группе, как в listagg.
Ответ 9
Думаю, вам будет легко. Я использую group_concat, который объединяет различные значения с разделителем, как мы определили
select ID,User, GROUP_CONCAT(Distinct Department order by Department asc
separator ', ') as Department from Table_Name group by ID