sql - 从结果集中消除部分重复行

标签 sql sql-server tsql

我有一个查询返回类似于下面的结果集(实际上它要大得多,有数千行):

     A    | B  | C  |    D
     -----|----|----|-----
1    NULL | d0 | d0 | NULL
2    NULL | d0 | d1 | NULL
3    NULL | d0 | d2 |   a0
4      d0 | d1 | d1 | NULL
5      d0 | d2 | d2 |   a0

其中两行被认为是重复的,1 和 2,因为 A、B 和 D 相同。为消除这种情况,我可以使用 SELECT DISTINCT A, B, D 但是我没有在我的结果集中得到 C 列。 C 列是第 3、4 和 5 行的必要信息。

那么我如何从上面的结果集得到这个(C4中出现的结果也可以是NULL而不是d1):

     A    | B  | C    | D
     -----|----|------|-----
1    NULL | d0 | NULL | NULL
3    NULL | d0 | d2   |   a0
4      d0 | d1 | d1   | NULL
5      d0 | d2 | d2   |   a0

最佳答案

DECLARE @YourTable TABLE (
  A VARCHAR(2)
  , B VARCHAR(2)
  , C VARCHAR(2)
  , D VARCHAR(2))

INSERT INTO @YourTable VALUES (NULL, 'd0', 'd0', NULL)
INSERT INTO @YourTable VALUES (NULL, 'd0', 'd1', NULL)
INSERT INTO @YourTable VALUES (NULL, 'd0', 'd2', 'a0')
INSERT INTO @YourTable VALUES ('d0', 'd1', 'd1', NULL)
INSERT INTO @YourTable VALUES ('d0', 'd2', 'd2', 'a0')


SELECT A, B, C = MIN(C), D
FROM @YourTable
GROUP BY A, B, D

SELECT A, B, CASE WHEN MIN(C) = MAX(C) THEN MIN(C) ELSE NULL END, D
FROM @YourTable
GROUP BY A, B, D

SELECT A, B, CASE WHEN MIN(COALESCE(C, 'dx')) = MAX(COALESCE(C, 'dx')) THEN MIN(C) ELSE NULL END, D
FROM @YourTable
GROUP BY A, B, D

关于sql - 从结果集中消除部分重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/729428/

相关文章:

C# 将数据插入 SQL 数据库的最快方法

sql - SQL 中的日期序列?

sql - 在存储过程中将数据类型 varchar 转换为 bigint 时出错

SQL:如何使用 where like 组合多列的结果

sql - 内部联接与内部远程联接之间的区别

sql - 在 SQL 中将两列值显示为两行

sql - (PostgreSQL) 9.3.11 中 THEN 的案例语句 COUNT

php - 需要有关构建具有 MySQL 和 MSSQL 双连接的 php 框架的建议

c# - SQL错误关键字 'user'附近的语法不正确

sql - 如何强制 SQL Server 以特定顺序执行查询