簡體   English   中英

在 SQL 查詢中“標記”特定條件

[英]To 'flag' a specific condition in SQL query

我有以下格式的結果集,我需要標記“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

您可以使用窗口函數來做到這一點:

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;      

假設您使用的是 SQL Server 並且需要將輸出列添加到原始表中,您可以嘗試以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM