将所有匹配的行复制到SQL Server 2008中另一个表中的一个单元格中

时间:2015-09-16 06:19:30

标签: sql sql-server

我尝试做的是从两个表中找到所有匹配的ID,然后将多个行合并到原始表中的一个单元格中。

所以我有这两张桌子。 表1

+-----+-------+
| id  | BS_ID |
+-----+-------+
| 999 | 12345 |
| 977 | 12347 |
| 955 | 12349 |
| 933 | 12351 |
+-----+-------+

表2

+-----+-------+------------+
| id  | BS_ID | callstatus |
+-----+-------+------------+
| 999 | 12345 | noanswer   |
| 999 | 12345 | contacted  |
| 977 | 12347 | noanswer   |
| 955 | 12349 | noanswer   |
| 933 | 12351 | noanswer   |
| 933 | 12351 | contacted  |
+-----+-------+------------+

我想要发生的是根据表1中的id找到表2中所有匹配的行。然后复制" callstatus"在所有匹配的行中,将它放在表1中的一个单元格中,如下所示:

+-----+-------+---------------------+
| id  | BS_ID |     callstatus      |
+-----+-------+---------------------+
| 999 | 12345 | noanswer, contacted |
| 977 | 12347 | noanswer            |
| 955 | 12349 | noanswer            |
| 933 | 12351 | noanswer, contacted |

到目前为止,我已经想出如何计算表2中的实例,但我对如何复制" callstatus"进入表1中的那个单元格。

SELECT table1.*
, (SELECT COUNT(*) 
   FROM table2 
   WHERE table2.id = table1.id) AS TOT 
FROM table1 

3 个答案:

答案 0 :(得分:3)

你在这里:

(但请记住:你没有排序顺序,因此callstatus可能以随机顺序出现。而且 - 如果你不需要这只是为了输出 - 考虑将它放在XML列中的可能性)< / p>

DECLARE @Table1 TABLE(id INT,BS_ID INT);
INSERT INTO @Table1 VALUES
 (999,12345)
,(977,12347)
,(955,12349)
,(933,12351);

DECLARE @Table2 TABLE(id INT,BS_ID INT,callstatus VARCHAR(100));
INSERT INTO @Table2 VALUES
 (999,12345,'noanswer')
,(999,12345,'contacted')
,(977,12347,'noanswer')
,(955,12349,'noanswer')
,(933,12351,'noanswer')
,(933,12351,'contacted');


SELECT DISTINCT tbl1.id
               ,tbl1.BS_ID
               ,STUFF(
                        (
                        SELECT ', ' + tbl2.callstatus
                        FROM @Table2 AS tbl2
                        WHERE tbl1.id  = tbl2.id AND tbl1.BS_ID=tbl2.BS_ID
                        FOR XML PATH('')
                        ), 1, 2, '')  AS StatusList
FROM @Table1 AS tbl1

答案 1 :(得分:1)

SELECT t1.id,t1.id_bsid,substring(statussummary1,1,len(statussummary1)-1)
from table1 t1
       inner join table2 as t21 on t1.id=t21.id and t1.id_bsid=t21.id_bsid
cross apply
(
    SELECT statussummary + ','
    FROM table2 AS t2
    WHERE t2.id = t21.id and t2.id_bsid = t21.id_bsid
    FOR XML PATH('')
)grping(statussummary1)
group by t1.id,t1.id_bsid,statussummary1

在这里小提琴:http://sqlfiddle.com/#!3/18fb53

答案 2 :(得分:0)

试试这个

  ;WITH CTE AS
    (
    SELECT
     DetailsTable.id
    ,DetailsTable.BS_ID
    ,(SELECT
        Concated.CALLSTATUS+ ','    
     FROM
        Table2  Concated
    WHERE Concated.id = DetailsTable.id

     FOR XML PATH('')

    )  As callstatus
    FROM
    Table1
    INNER JOIN
    Table2 DetailsTable
    ON Table1.id = DetailsTable.id
    )
    SELECT
      id
     ,BS_ID
     ,SUBSTRING(callstatus,0,LEN(callstatus)) AS CallStatus
    FROM 
    CTE
    GROUP BY
    callstatus
    ,id
    ,BS_ID
    Order by
    id desc