CREATE TABLE #rss(cust_ref VARCHAR(32), consolidated_stmt_num INT);
CREATE TABLE #SC(cust_ref VARCHAR(32), consolidated_stmt_num INT);
INSERT #SC VALUES
('A',1),('A',2),('A',3),('A',4),('A',5),('A',6),('A',7),('A',8),('A',9),
('B',1),('B',2),('B',3),('B',4),('B',5),('B',6),('B',7),('B',8),('B',9),
('C',1),('C',2),('C',3),('C',4),('C',5),('C',6),('C',7),('C',8),('C',9);
-- missing A,7 and C,2/C,4:
INSERT #rss VALUES
('A',1),('A',2),('A',3),('A',4),('A',5),('A',6), ('A',8),('A',9),
('B',1),('B',2),('B',3),('B',4),('B',5),('B',6),('B',7),('B',8),('B',9),
('C',1), ('C',3), ('C',5),('C',6),('C',7),('C',8),('C',9);
GO
-- This alone will tell you the cust_refs with missing statements (and which ones they are):
SELECT cust_ref, consolidated_stmt_num FROM #SC
EXCEPT
SELECT cust_ref, consolidated_stmt_num FROM #rss;
-- This will allow you to get the full concatenated list from each table, on one line:
;WITH x AS
(
SELECT DISTINCT cust_ref FROM
(
SELECT cust_ref, consolidated_stmt_num FROM #SC
EXCEPT
SELECT cust_ref, consolidated_stmt_num FROM #rss
) AS y
)
SELECT x.cust_ref,
rss = STUFF((SELECT ',' + CONVERT(VARCHAR(12), r.consolidated_stmt_num)
FROM #rss AS r WHERE r.cust_ref = x.cust_ref
ORDER BY r.cust_ref
FOR XML PATH(''), TYPE).value('./text()[1]','varchar(max)'),1,1,''),
sc = STUFF((SELECT ',' + CONVERT(VARCHAR(12), s.consolidated_stmt_num)
FROM #SC AS s WHERE s.cust_ref = x.cust_ref
ORDER BY s.cust_ref
FOR XML PATH(''), TYPE).value('./text()[1]','varchar(max)'),1,1,'')
FROM x;
-- if you need them on separate lines:
;WITH x AS
(
SELECT DISTINCT cust_ref FROM
(
SELECT cust_ref, consolidated_stmt_num FROM #SC
EXCEPT
SELECT cust_ref, consolidated_stmt_num FROM #rss
) AS y
)
SELECT x.cust_ref, source = 'rss',
list = STUFF((SELECT ',' + CONVERT(VARCHAR(12), r.consolidated_stmt_num)
FROM #rss AS r WHERE r.cust_ref = x.cust_ref
ORDER BY r.cust_ref
FOR XML PATH(''), TYPE).value('./text()[1]','varchar(max)'),1,1,'')
FROM x
UNION ALL SELECT x.cust_ref, 'sc',
list = STUFF((SELECT ',' + CONVERT(VARCHAR(12), s.consolidated_stmt_num)
FROM #SC AS s WHERE s.cust_ref = x.cust_ref
ORDER BY s.cust_ref
FOR XML PATH(''), TYPE).value('./text()[1]','varchar(max)'),1,1,'')
FROM x
ORDER BY cust_ref, source;
-- clean up:
DROP TABLE #rss, #SC;