在具有列的特定值的所有行中选择唯一值

时间:2017-05-02 08:26:28

标签: sql sql-server tsql group-by having

我有一个需求需要获取所有行的特定值的键的所有不同记录,而不是在其他行中有其他值。

表格结构:

  Select TOP (1000)
   [Old_Branch_Code]
  ,[Computer_Name]
  ,[Migrated]
  ,[Migration_Date]
  FROM [TestDB].[dbo].[ABS_Computer_Details]

因此,如果表ABS_Computer_Details包含像

这样的记录
  1, 'X', 'SUCCESS','12/12/12'
  1, 'Y', 'SUCCESS','12/12/12'
  1, 'Z', 'SUCCESS','12/12/12'
  1, 'W', 'Failed','12/12/12'
  2, 'Y', 'SUCCESS','12/12/12'
  2, 'Z', 'SUCCESS','12/12/12'
  3, 'Z', 'Failed','12/12/12'
  4, 'Z', 'SUCCESS','12/12/12'

因此, 选择branch_code = 2和branch_code = 4;因为branch_code = 1和branch_code = 3的列之一的状态='失败'。

我的尝试:

select Old_Branch_Code from dbo.ABS_Computer_Details
group by Old_Branch_Code,Migrated having Migrated='SUCCESS'

但是,我的查询返回的是branch_code = 1,branch_code = 2和branch_code = 4的值。根据我的要求,我应该只有branch_code = 2和branch_code = 4。

偏离主题:我知道这非常简单,但我对数据库查询很差,因为我不是DBA人。

3 个答案:

答案 0 :(得分:2)

这里的一种方法是在HAVING子句中使用条件聚合来检查是否存在除SUCCESS以外的任何迁移。如果我们找不到SUCCESS以外的任何内容,那么我们会保留该分支代码。

SELECT Old_Branch_Code
FROM dbo.ABS_Computer_Details
GROUP BY Old_Branch_Code
HAVING SUM(CASE WHEN migrated != 'SUCCESS' THEN 1 ELSE 0 END) = 0

答案 1 :(得分:1)

您可以过滤记录NOT EXISTS。您可以按如下方式获取所有列。

SELECT *
FROM dbo.ABS_Computer_Details A
WHERE
    NOT EXISTS
    (   
        SELECT 1 FROM dbo.ABS_Computer_Details B
        WHERE
            B.Old_Branch_Code = A.Old_Branch_Code AND
            B.Migrated = 'Failed'
    )

答案 2 :(得分:-2)

请尝试以下方法......

SELECT Old_Branch_Code,
       Computer_Name,
       Migration_Date
FROM ABS_Computer_Details
WHERE Old_Branch_Code NOT IN ( SELECT Old_Branch_Code AS failedBranchCode
                               FROM ABS_Computer_Details
                               WHERE Migrated = 'FAILED'
                               GROUP BY Old_Branch_Code
                            )
ORDER BY Old_Branch_Code,
         Computer_Name,
         Migration_Date;

此语句首先使用子查询查找Old_Branch_CodeMigrated相关联的所有FAILED值的列表。< / p>

主语句然后选择Old_Branch_Code 属于此列表的每条记录。

如果您有任何问题或意见,请随时发表评论。

附录

我已针对使用以下脚本创建的数据库测试了我的代码...

CREATE TABLE ABS_Computer_Details
(
    Old_Branch_Code   INT,
    Computer_Name     VARCHAR( 20 ),
    Migrated          VARCHAR( 20 ),
    Migration_Date    DATE
);
INSERT INTO ABS_Computer_Details ( Old_Branch_Code,
                                   Computer_Name,
                                   Migrated,
                                   Migration_Date )
VALUES ( 1, 'X', 'SUCCESS', '2012/12/13' ),
       ( 1, 'Y', 'SUCCESS', '2012/12/13' ),
       ( 1, 'Z', 'SUCCESS', '2012/12/13' ),
       ( 1, 'W', 'Failed',  '2012/12/13' ),
       ( 2, 'Y', 'SUCCESS', '2012/12/13' ),
       ( 2, 'Z', 'SUCCESS', '2012/12/13' ),
       ( 3, 'Z', 'Failed',  '2012/12/13' ),
       ( 4, 'Z', 'SUCCESS', '2012/12/13' );