27,579
社区成员
发帖
与我相关
我的任务
分享
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
GO
CREATE TABLE t(
cardNo VARCHAR(20) PRIMARY KEY,
c0 VARCHAR(20),
c1 VARCHAR(20),
c2 VARCHAR(20),
c3 VARCHAR(20)
)
GO
SET NOCOUNT ON
INSERT INTO t VALUES ('1X','1','2','3','4')
INSERT INTO t VALUES ('2X','2','2','2','2')
INSERT INTO t VALUES ('3X','1','1','3','4')
INSERT INTO t VALUES ('4X','1','1','1','1')
;WITH cte AS (
SELECT cardNo,c0 AS cc FROM t
UNION
SELECT cardNo,c1 FROM t
UNION
SELECT cardNo,c2 FROM t
UNION
SELECT cardNo,c3 FROM t
)
,cte2 AS (
SELECT
a.cardNo
,tt.cardNoFlag
FROM cte AS a CROSS APPLY (
SELECT b.cardNo AS cardNoFlag FROM cte AS b WHERE a.cardNo!=b.cardNo AND a.cc=b.cc
) AS tt
)
SELECT a.cardNo
,(SELECT count(DISTINCT b.cardNoFlag) FROM cte2 AS b WHERE a.cardNo=b.cardNo ) AS cnt
,STUFF((SELECT DISTINCT ','+ b.cardNoFlag FROM cte2 AS b WHERE a.cardNo=b.cardNo FOR XML PATH('')),1,1,'') AS otherCardNo
FROM t AS a
GROUP BY a.cardNo
/*
cardNo cnt otherCardNo
1X 3 2X,3X,4X
2X 1 1X
3X 2 1X,4X
4X 2 1X,3X
*/