我尝试做的是从两个表中找到所有匹配的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
答案 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
答案 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