根据条件出现标记地址
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
请注意 SiteAddress
、Required?
和 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
我想创建一个新的 '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
请注意 SiteAddress
、Required?
和 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