2017-06-16 114 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值另一個表加速此。

相關問題