代码之家  ›  专栏  ›  技术社区  ›  Martin

如何选择不同的行,其中一列可能具有相同的值,但所有第二列的值都相同?

  •  1
  • Martin  · 技术社区  · 15 年前

    我有一张表格:

    test_name | test_result
    -----------------------
    test1     | pass 
    test2     | fail 
    test1     | pass   
    test1     | pass   
    test2     | pass   
    test1     | pass   
    test3     | pass   
    test3     | fail   
    test3     | pass 
    

    正如您可以看到的,所有的test1都通过了,而test2和test3都通过了并且失败了。

    是否有SQL语句可用于返回只通过的测试的不同名称?例如Test1

    2 回复  |  直到 15 年前
        1
  •  5
  •   Mark Byers    15 年前

    您可以按测试名称分组,计算通过次数,并检查它是否与组中的行数相同。

    SELECT test_name
    FROM table1
    GROUP BY test_name
    HAVING SUM(test_result = 'pass') = COUNT(*)
    

    或者,计算失败的次数并检查它是否为零:

    SELECT test_name
    FROM table1
    GROUP BY test_name
    HAVING SUM(test_result = 'fail') = 0
    

    结果:

    test1
    

    测试数据:

    CREATE TABLE table1 (test_name NVARCHAR(100) NOT NULL, test_result NVARCHAR(100) NOT NULL);
    INSERT INTO table1 (test_name, test_result) VALUES
    ('test1', 'pass'),
    ('test2', 'fail'),
    ('test1', 'pass'),
    ('test1', 'pass'),
    ('test2', 'pass'),
    ('test1', 'pass'),
    ('test3', 'pass'),
    ('test3', 'fail'),
    ('test3', 'pass');
    
        2
  •  0
  •   Michael Mrozek    15 年前

    这可能不是最简单的方法(我倾向于滥用子查询),但您可以这样做:

    SELECT test_name FROM tests AS a WHERE NOT EXISTS (SELECT test_name FROM tests AS b WHERE a.test_name = b.test_name AND test_result != 'pass') GROUP BY test_name;