SQL查询,用于确定行组是否在特定列中具有特定值

时间:2017-06-16 21:08:53

标签: sql-server

我在SQL Server 2016中工作。我有下表和示例数据:

CREATE TABLE A
(
    col1 char(1)
    ,col2 int
    ,indicator_flag char(4)
)
;

INSERT INTO A
VALUES
('A', 1, 'Pass')
,('A', 2, 'Pass')
,('A', 3, 'Fail')
,('B', 10, 'Pass')
,('C', 19, 'Fail')
,('D', 1, 'Fail')
,('D', 2, 'Fail')
,('E', 1, 'Pass')
,('E', 2, 'Pass')
,('F', 20, 'Fail')
,('F', 21, 'Fail')
,('F', 100, 'Pass')
;

indicator_flag列只会保留值' Pass'并且'失败'对于col1中的每个不同值,我想根据以下规则返回折叠的indicator_flag值 - 如果所有值都是'通过',那么'传递&# 39 ;;否则,'失败'

因此,对于样本数据,我期望得到以下输出:

col1        collapsed_indicator_flag
A           Fail
B           Pass
C           Fail
D           Fail
E           Pass
F           Fail

如何实现此输出?解决方案需要表现良好。 (我的实际桌子非常大。)

1 个答案:

答案 0 :(得分:3)

一种方法是使用聚合:

select col1, min(indicator_flag) as indicator_flag
from a
group by col1;

这使用了'Pass'>的观察结果。 'Fail'

如果你想要性能,那么你可以加快速度,如果你有正确的索引和另一个只有col1值的表:

select t.col1, coalesce(a.indicator_flag, 'Pass') as indicator_flag
from col1table t outer apply
     (select a.*
      from a
      where a.col1 = t.col1 and a.indicator_flag = 'Fail'
     ) a;

此查询的索引为a(col1, indicator_flag)