根据条件出现标记地址

Flagging an Address based on a conditional occurrences

我想创建一个新的 'Hit?' 列 returns Hit 如果 SiteLocation 在 'Required?' 列中有 1 而没有在 'Product-Status'.

列中有 Pie-Active

这是开头 table:

站点地址 需要吗? 产品状态
1234某某街 1 蛋糕活性
1234某某街 0 馅饼活跃
1234某某街 0 蛋糕不活跃
1234某某街 0 KeyLime-active
1234某某街 0 香草圣代活跃
1234某某街 0 馅饼不活跃
567 其他街道 0 蛋糕活性
567 其他街道 1 蛋糕不活跃
567 其他街道 0 KeyLime-无效

在此示例中,SiteLocation 567 other street 将被标记为 hit,因为它至少包含一个 1,但不包含任何 Pie-active。请参阅下面我希望创建的内容:

站点地址 需要吗? 产品状态 命中?
1234某某街 1 蛋糕活性 没有命中
1234某某街 0 馅饼活跃 没有命中
1234某某街 0 蛋糕不活跃 没有命中
1234某某街 0 KeyLime-active 没有命中
1234某某街 0 香草圣代活跃 没有命中
1234某某街 0 馅饼不活跃 没有命中
567 其他街道 0 蛋糕活性 命中
567 其他街道 1 蛋糕不活跃 命中
567 其他街道 0 KeyLime-无效 命中

虽然 1234 something street 在 'Required?' 列中有 1,但它也有 Pie-active,所以这是一个不满足条件的例子。

我明白我需要使用类似这样的逻辑:

condition1 = Required? == 1
condition2 = Product-Status != 'Pie-Active'
RelevantAddresses  = distinct SiteAddresses satisfying condition 1 and condition 2
New Column: Hit? = if SiteAddress is in RelevantAddresses, Hit, otherwise No Hit

请注意 SiteAddressRequired?Product-Status 都是别名(我必须手动创建它们)所以我相信我需要创建子查询来访问这些字段。

我试图创建此查询,但我 运行 遇到了一些困难。到目前为止我有这个:

DECLARE @Required? as bit
DECLARE @COND1 as bit

SET @COND1 = CASE WHEN @Required? = 1 THEN 1 ELSE 0 END

SELECT @Required? = (SELECT 
CASE
WHEN
.... subquery ... as Required?

    
SET @COND2 = CASE WHEN @Product-Status != 1 THEN 1 ELSE 0 END

SELECT @Product-Status = (SELECT
CASE 
WHEN 
.... subquery ... as Product-Status

谢谢

您可以使用子查询:

select t1.*, 
       case when tmp.SiteAddress is not null 
            then 'Hit'
            else 'No Hit'
       end as [Hit?]
from your_table t1
left join 
(
  select SiteAddress
  from your_table
  group by SiteAddress
  having max([Required?]) = 1  
     and sum(case when [Product-status] = 'Pie-Active' then 1 else 0 end) = 0
) tmp on t1.SiteAddress = tmp.SiteAddress

或更短的使用 window 函数:

select *, 
       case when sum(case when [Product-status] = 'Pie-Active' then 1 else 0 end) over (partition by SiteAddress) = 0
                 and max([Required?]) over (partition by SiteAddress) = 1  
            then 'Hit'
            else 'No Hit'
       end as [Hit?]
from your_table

SQLFiddle demo