SQL 服务器查询以在 table 中查找重复,Yes/No 显示在行中

SQL server query to find duplication in a table with Yes/No displayed in rows

我想找到重复的记录并在结果 table 中以从行到列的格式显示它,其中包含 Y/N 个值。

附件是我期望的示例 table 和结果 table 结果。

谢谢, 凯文

请使用 PIVOT 尝试此解决方案。

数据生成

CREATE TABLE Table1
(
     Name VARCHAR(10)
    ,SNO INT
    ,DNO VARCHAR(10)
)
GO

INSERT INTO Table1 VALUES
('qwe',123, 'd1'),
('qwe',123, 'd2'),
('qwe',123, 'd3'),
('qwe',123, 'd4'),
('asd',456, 'd4'),
('asd',456, 'd4')
GO

解决方案

;WITH CTE AS
(
    SELECT * , 'Y' N, COUNT(*) OVER(PARTITION BY name,sno) cnt FROM Table1
)
,CTE1 AS
(
    SELECT Name,SNO,
    ISNULL([d1],'N') [d1],ISNULL([d2],'N') [d2],ISNULL([d3],'N') [d3],ISNULL([d4],'N') [d4]     
    FROM CTE
    PIVOT
    (
        MAX(N) FOR DNO IN ([d1],[d2],[d3],[d4])
    )t
)
SELECT * , 
         CASE WHEN [d1] = 'Y' THEN 1 ELSE 0 END + 
         CASE WHEN [d2] = 'Y' THEN 1 ELSE 0 END + 
         CASE WHEN [d3] = 'Y' THEN 1 ELSE 0 END + 
         CASE WHEN [d4] = 'Y' THEN 1 ELSE 0 END Cnt
FROM CTE1

输出

Name       SNO         d1   d2   d3   d4   Cnt
---------- ----------- ---- ---- ---- ---- -----------
qwe        123         Y    Y    Y    Y    4
asd        456         N    N    N    Y    1

(2 rows affected)

另一个没有 PIVOT 的解决方案。。有点容易理解,因为很多人觉得 pivot 有点难以理解。

SELECT * , 
         CASE WHEN [d1] = 'Y' THEN 1 ELSE 0 END + 
         CASE WHEN [d2] = 'Y' THEN 1 ELSE 0 END + 
         CASE WHEN [d3] = 'Y' THEN 1 ELSE 0 END + 
         CASE WHEN [d4] = 'Y' THEN 1 ELSE 0 END Cnt
FROM 
(
    SELECT Name,SNO
        ,MAX(CASE WHEN DNO = 'd1' THEN 'Y' ELSE 'N' END) [d1] 
        ,MAX(CASE WHEN DNO = 'd2' THEN 'Y' ELSE 'N' END) [d2]
        ,MAX(CASE WHEN DNO = 'd3' THEN 'Y' ELSE 'N' END) [d3]
        ,MAX(CASE WHEN DNO = 'd4' THEN 'Y' ELSE 'N' END) [d4]    
    FROM Table1
    GROUP BY Name,SNO
)y

输出

Name       SNO         d1   d2   d3   d4   Cnt
---------- ----------- ---- ---- ---- ---- -----------
qwe        123         Y    Y    Y    Y    4
asd        456         N    N    N    Y    1

(2 rows affected)