2017-06-16 113 views
0

我在SQL Server 2016年的工作,我有以下表和样本数据:SQL查询,以确定是否行组在特定的列具有特定值

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列仅会举行值'通过'和'失败'。对于col1中的每个不同的值,我想根据以下规则返回折叠的indicator_flag值 - 如果所有值均为“通过”,则为“通过”。否则,'失败'。

所以,对于样本数据,我期待下面的输出:

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

我怎样才能做到这一点的输出?解决方案需要表现良好。 (我的实际表是非常大的。)

回答

3

一种方法是使用聚合:

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

它使用观察到'Pass'>'Fail'

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)

如果你想表现,那么你可以,如果你有正确的索引,并与刚刚col1值另一个表加速此。

相关问题