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)
我想找到重复的记录并在结果 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)