Как получить значения столбца в одном значении, разделенном запятой

У меня есть таблица, которая содержит строки, как показано ниже

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