2012-09-06 92 views
3

我認爲這是一個新手問題,但我沒有提出任何東西是我的搜索。SQL - 組合一個值的結果(行)

兩個表:

表1名稱:CLIENT

Inactive ClientID Name 
0   1001  Fred 
0   1002  Cindy 
0   1003  John 
0   1004  Sherry 

表2名稱:作者

ClientID RecordType Date  Comments 
1001  Note  01-01-2012 TXT1 
1001  Note  01-01-2012 TXT2 
1003  Note  01-01-2012 TXT3 
1001  Note  01-02-2012 TXT4 
1002  Note  01-06-2012 TXT5 
1003  Note  01-22-2012 TXT6 
1003  Note  01-23-2012 TXT7 

如果不知道有多少行會出現在作者對於特定的方式客戶端ID。可能不是或許多。

如果我使用以下給出的一切除了1004以外,這是我的第一個問題。

SELECT FROM CLIENT.InActive, CLIENT.ClientID, CLIENT.Name, JOURNAL.Comments 
LEFT OUTER JOIN JOURNAL ON CLIENT.ClientID = JOURNAL.ClientID 
WHERE CLIENT.Inactive = 0 and JOURNAL.Date > '2011-01-01' 

我想要做的是將JOURNAL.Comments的結果合併爲一條記錄。

ClientID Name Comments 
1001  Fred TXT1, TXT2, TXT4 
1002  Cindy TXT5 
1003  John TXT3, TXT6, TXT7 
1004  Sherry 

修訂:我從Faircom ODBC數據源提取數據,所以我有限的,無法使用創建一個TMP表。我使用Excel或MSQUERY,因爲我無法獲得SMS連接到FairCom驅動程序。

任何建議,將不勝感激。是...我知道別名'。想要保持簡單,因爲我很難抓住這個。

+0

很抱歉的格式。不知何故,它在提交後受到屠殺。請讓我知道,如果你不能遵循。謝謝。 – user1650365

+4

您使用的是什麼RDBMS? SQL Server,MySQL,Oracle? – Taryn

+0

重複的[SQL Server:我可以逗號分隔多行到一列?](http://stackoverflow.com/questions/2046037/sql-server-can-i-comma-delimit-multiple-rows-into-one -column) – Kermit

回答

2

對於SQL Server 2008這是解決方案,添加您的where子句

SELECT ClientID ,Name ,Comments= STUFF((SELECT ','+ yt.Comments 
                FROM JOURNAL yt 
                WHERE yt.ClientID = sc.ClientID    
                FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '') 
     FROM CLIENT AS sc 
4

首先第一件事情,你沒有得到,因爲你在哪裏放置了date過濾1004記錄,將其移動到left join

select c.inactive, 
    c.clientid, 
    c.name, 
    j.comments 
from client c 
left join journal j 
    on c.clientid = j.clientid 
    and j.dt > '2011-01-01' 
where c.inactive = 0 

其次,你沒有指定RDBMS,所以這裏有一些選擇:

在SQL SERV呃,你可以使用STUFF()

select c.inactive, 
    c.clientid, 
    c.name, 
    STUFF((SELECT distinct ', ' + comments 
       from journal j 
       where j.clientid = c.clientid 
       and j.dt > '2011-01-01' 
      FOR XML PATH(''), TYPE 

      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 
from client c 
where c.inactive = 0 

SQL Fiddle with Demo

在MySQL中使用GROUP_CONCAT()

select c.inactive, 
    c.clientid, 
    c.name, 
    GROUP_CONCAT(COALESCE(j.comments, 'NULL')) 
from client c 
left join journal j 
    on c.clientid = j.clientid 
    and j.dt > '2011-01-01' 
where c.inactive = 0 
GROUP BY c.inactive, 
    c.clientid, 
    c.name 

SQL Fiddle with Demo

在Oracle中你可以使用listagg()功能:

select c.inactive, 
    c.clientid, 
    c.name, 
    LISTAGG(j.comments, ',') WITHIN GROUP (ORDER BY c.clientid) AS comments 
from client c 
left join journal j 
    on c.clientid = j.clientid 
    and j.dt > to_date('2011-01-01', 'yyyy-mm-dd') 
where c.inactive = 0 
GROUP BY c.inactive, 
    c.clientid, 
    c.name 

SQL Fiddle with Demo

+0

'+ 1'對你來說,你在DB2嗎? :) –

+0

@JohnWoo如果我有權訪問DB2,我會添加它。 – Taryn

+0

爲什麼我會得到「文字不允許在ON條件」?我懷疑這是'圍繞價值。使用MSQury或Excel連接到FairCOM ODBC驅動程序。 – user1650365

3

下面是使用CROSS APPLY

SELECT a.inactive , 
     a.clientid, 
     a.name, 
     SUBSTRING(d.CommentsList,1, LEN(d.CommentsList) - 1) CommentsList 
FROM client a 
     CROSS APPLY 
     (
      SELECT comments + ', ' 
      FROM journal AS B 
      WHERE A.clientid = B.clientid 
      FOR XML PATH('') 
     ) D (CommentsList) 

SQLFiddle Demo

特別感謝另一個版本bluefeetSQLFiddle DDL