21

以下のような行を含むテーブルがあります

ID  User      Department
1   User1     Admin
2   User1     Accounts
3   User2     Finance
4   User3     Sales
5   User3     Finance

フォーマットに従って結果が得られる選択クエリが必要です

ID  User      Department
1   User1     Admin,Accounts
2   User2     Finance
3   User3     Sales, Finance
4

10 に答える 10

36

質問に 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 with Demoを参照してください。

Oracle 11g+ では、以下を使用できますLISTAGG

select "User",
  listagg(department, ',') within group (order by "User") as departments
from yourtable
group by "User"

デモで SQL Fiddle を参照してください

wm_concatOracle 11g より前は、次の関数を使用できました。

select "User",
  wm_concat(department) departments
from yourtable
group by "User"
于 2013-04-01T11:47:35.943 に答える
12

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
于 2013-11-21T09:17:58.637 に答える
6

MYSQL: 列の値を 1 つのカンマ区切りの値として取得するには、 GROUP_CONCAT( )関数を 次のように使用します。

GROUP_CONCAT(  `column_name` )

例えば

SELECT GROUP_CONCAT(  `column_name` ) 
FROM  `table_name` 
WHERE 1 
LIMIT 0 , 30
于 2013-09-27T07:01:19.277 に答える
1
SELECT name, GROUP_CONCAT( section ) 
FROM  `tmp` 
GROUP BY name
于 2015-02-04T06:30:25.773 に答える
1

あなたにとっては簡単だと思います。定義したように、異なる値を区切り記号で連結する group_concat を使用しています

select ID,User, GROUP_CONCAT(Distinct Department order  by Department asc 

separator ', ') as Department from Table_Name   group by ID
于 2017-08-13T13:49:05.123 に答える
0

WM_CONCAT をサポートしていない Oracle バージョンの場合、以下を使用できます。

  select "User", RTRIM(
     XMLAGG (XMLELEMENT(e, department||',') ORDER BY department).EXTRACT('//text()') , ','
     ) AS departments 
  from yourtable 
  group by "User"

これははるかに強力で柔軟です。 listaggのように、各グループ内で区切り文字と並べ替え順序の両方を指定できます。

于 2014-03-25T07:10:44.870 に答える