我有一个包含表YEAR和STATUS的Oracle表CUST。我正在尝试编写一条语句来选择其中((CUST.YEAR ='2017'和CUST.STATUS ='ACTIVE')和(CUST.YEAR ='2018'和CUST.STATUS ='ACTIVE')的记录))。当这两个语句都为真时,我想返回“ 1”,否则返回“ 0”
select *
from cust
where cust.year = '2017' and cust.status = 'Active'
返回正确的行数(394)。
select *
from cust
where cust.year = '2018' and cust.status = 'Active'
返回正确的行数(451)。
这是轮子脱落的地方(由于我对SQL脚本的经验不足)。我试图结合两个选择语句,由于语法错误,我要么得到数万行,要么得到错误。甚至在尝试使用case语句返回比较结果之前(如果这两个条件均为“ 1”,否则为“ 0”)。
我意识到这可能是相当基本的东西,但是到目前为止,语法已经超出了我的范围。会有足够的好心帮助我构建这个陈述吗?
我几次在这个论坛上发帖,我学到了一些使我更加自给自足的东西,所以我在此先表示感谢。
答案 0 :(得分:1)
根据我的理解,or
可能就是您想要的,即
select *
from cust
where (cust.year = '2017' and cust.status = 'Active')
or (cust.year = '2018' and cust.status = 'Active');
正如威廉所说,它导致了
where cust.status = 'Active'
and cust.year in ('2017', '2018')
答案 1 :(得分:1)
您可以在这里利用IN
:
select *
from cust
where cust.year IN ('2017', '2018') and
cust.status = 'Active'
答案 2 :(得分:0)
如果我正确地理解了您的要求,则要确定您的表是否同时具有这两个条件对的记录,即您是否同时具有2017和2018的活动记录。到目前为止,提供的解决方案将确定 条件为真,但不是同时满足。
因此,这里有一个满足您实际需求的解决方案。我们有一个WITH子句,它每年选择一个活动记录(这是您的全部需求)。内联视图然后计算找到的记录数量。如果计数为2,则您有两年的有效记录。
with tst as (
select cust.cust_id, cust.year
from cust
where cust.year = '2017'
and cust.status = 'Active'
group by cust.cust_id, cust.year
union all
select cust.cust_id, cust.year
from cust
where cust.year = '2018'
and cust.status = 'Active'
group by cust.cust_id, cust.year
)
select cust_id
, case when cnt = 2 then 1 else 0 end as your_condition
from ( select cust_id, count(*) as cnt
from tst
group by cust_id )
/