3

我认为这是一个新手问题,但我没有想出什么是我的搜索。

两张表:

表 1 名称:客户

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

如果无法知道特定 ClientID 的 JOURNAL 中有多少行。可能没有也可能很多。

如果我使用以下内容,这给了我除了 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 源中提取数据,因此我受到限制并且无法将 CREATE 用于 TMP 表。我正在使用 Excel 或 MSQUERY,因为我无法通过 SMS 连接到 FairCom 驱动程序。

任何建议,将不胜感激。是的......我知道别名'。想要保持简单,因为我很难掌握这个。

4

3 回答 3

4

首先,1004由于放置date过滤器的位置,您没有获得记录,请将其移至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 Server 中,您可以使用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

在 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

在 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

于 2012-09-06T00:52:50.573 回答
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 演示

特别感谢bluefeetSQLFiddle DDL

于 2012-09-06T01:02:06.720 回答
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
于 2012-09-06T00:51:08.013 回答