在SQL查询中“标记”特定条件

时间:2018-04-03 15:11:50

标签: sql

我有以下格式的结果集,我需要标记“GroupColumn”

-------------------------------------------------------------------
  ID   GroupColumn         ConditionCol1         ConditionCol2
-------------------------------------------------------------------
  1    101                 ABC                   99
  2    101                 DEF                   99
  3    102                 ABC                   01
  4    102                 DEF                   01
  5    103                 ABC                   02
  6    103                 DEF                   99
  7    104                 DEF                   02
  8    104                 DEF                   99

首先,我需要根据“GroupColumn”标记数据,在这个“GroupColumn”中,我希望从一行满足条件“ABC”,从另一行满足“99”,但不一定要从同一行行。

我希望为“输出”列

获得最终结果集
-------------------------------------------------------------------
  ID   GroupColumn     ConditionCol1     ConditionCol2     Output
-------------------------------------------------------------------
  1    101             ABC               99                Satisfied 
  2    101             DEF               99                Satisfied
  3    102             ABC               01                
  4    102             DEF               01
  5    103             ABC               02                Satisfied
  6    103             DEF               99                Satisfied
  7    104             DEF               02
  8    104             DEF               99

2 个答案:

答案 0 :(得分:3)

您可以使用窗口功能执行此操作:

select t.*,
       (case when sum(case when conditioncol1 = 'ABC' then 1 else 0 end) over (partition by groupcolumn) > 0 and
                  sum(case when conditioncol2 = 99 then 1 else 0 end) over (partition by groupcolumn) > 0 
             then 'Satisfied'
        end) as flag
from t;

另一种方法是使用group by

select t.*, tt.flag
from t join
     (select groupcolumn, 'Satisfied' as flag
      from t
      where conditioncol1 = 'ABC' or conditioncol2 = 99
      group by groupcolumn
      having sum(case when conditioncol1 = 'ABC' then 1 else 0 end) > 0 and
             sum(case when conditioncol2 = 99 then 1 else 0 end) > 0
     ) tt
     on tt.groupcolumn = t.groupcolumn;      

答案 1 :(得分:0)

假设您使用的是SQL Server,并且需要将Output列添加到原始表中,可以尝试以下操作:

create table #temp 
(GroupColumn int,ConditionCol1 varchar(20),ConditionCol2 int)

insert into #temp values (100,'ABC',99)
insert into #temp values (100,'DEF',99)
insert into #temp values (101,'ABC',02)
insert into #temp values (101,'DEF',99)
insert into #temp values (102,'DEF',99)
insert into #temp values (102,'DEF',99)

ALTER TABLE #temp
ADD [Output] varchar(10)
GO

;with cte(GroupColumn) as (
   select GroupColumn
   from #temp
   where ConditionCol1 <> 'ABC'
     and ConditionCol2 = 99
)
UPDATE t
SET [Output] = 'Satisfied'
FROM #temp t
INNER JOIN cte on t.GroupColumn = cte.GroupColumn
WHERE t.ConditionCol1 = 'ABC'

UPDATE t
SET [Output] = 'Satisfied'
FROM #temp t
WHERE [Output] is null
and t.GroupColumn in (Select GroupColumn from #temp where [Output]='Satisfied')

select * from #temp