3

これは初心者の質問だと思いますが、私の検索では何も思いつきません。

2 つのテーブル:

Table1 名前: クライアント

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

Table2 名前: JOURNAL

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 の結果を 1 つのレコードに結合することです。

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

UPDATED : Faircom ODBC ソースからデータを取得しているため、制限があり、TMP テーブルに CREATE を使用できません。SMS を FairCom ドライバーに接続できないため、Excel または MSQUERY を使用しています。

任意の提案をいただければ幸いです。はい ... エイリアスを認識しています。これを理解するのに苦労しているので、シンプルにしたかったのです。

4

3 に答える 3

4

まず最初に、フィルター1004を配置した場所が原因でレコードを取得していません。次の場所に移動します。dateleft 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

第 2 に、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 を参照してください

listagg()Oracle では、次の関数を使用できます。

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 デモ

ブルーフィートに感謝しますSQLFiddle 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 に答える