求教分组求用户表中每年已经立户但没有销户客户数量。例如某客户可能在2015年存在,也可能在2016年存在,所有这两年客户数量都应该包含该用户。
select t.period,count(*) as value
from (
select (case when EXTRACT(YEAR FROM BUILD_DATE)<2017 and (EXTRACT(YEAR FROM CANCEL_DATE)>2016 and CUSTOMER_STATUS_CODE=9 or CUSTOMER_STATUS_CODE!=9) then '2016'
when EXTRACT(YEAR FROM BUILD_DATE)<2016 and (EXTRACT(YEAR FROM CANCEL_DATE)>2015 and CUSTOMER_STATUS_CODE=9 or CUSTOMER_STATUS_CODE!=9) then '2015'
end) as period
from FCT_CUSTOMER t1
)t group by t.periodCUSTOMER_STATUS_CODE=9代表销户
这样写的话,2016年的结果应该是对的,2015年的结果是除去2016年的数据剩下的符合2015年的。我该怎么写才符合要求?
select t.period,count(*) as value
from (
select (case when EXTRACT(YEAR FROM BUILD_DATE)<2017 and (EXTRACT(YEAR FROM CANCEL_DATE)>2016 and CUSTOMER_STATUS_CODE=9 or CUSTOMER_STATUS_CODE!=9) then '2016'
when EXTRACT(YEAR FROM BUILD_DATE)<2016 and (EXTRACT(YEAR FROM CANCEL_DATE)>2015 and CUSTOMER_STATUS_CODE=9 or CUSTOMER_STATUS_CODE!=9) then '2015'
end) as period
from FCT_CUSTOMER t1
)t group by t.periodCUSTOMER_STATUS_CODE=9代表销户
这样写的话,2016年的结果应该是对的,2015年的结果是除去2016年的数据剩下的符合2015年的。我该怎么写才符合要求?
from (
select (case when EXTRACT(YEAR FROM BUILD_DATE)<2017 and (EXTRACT(YEAR FROM CANCEL_DATE)>2016 ) then '2016'
when EXTRACT(YEAR FROM BUILD_DATE)<2016 and (EXTRACT(YEAR FROM CANCEL_DATE)>2015 ) then '2015'
end) as period
from FCT_CUSTOMER t1
)t group by t.period不知道你 CUSTOMER_STATUS_CODE=9 or CUSTOMER_STATUS_CODE!=9 这句话想约束什么,这个的结果不就是 1 吗?
select sum(decode(t.period,'2016',1,0)) "2016",
sum(decode(t.period,'2015',1,-1)) "2015"
from (
select (case when EXTRACT(YEAR FROM BUILD_DATE)<2017 and (EXTRACT(YEAR FROM CANCEL_DATE)>2016 and CUSTOMER_STATUS_CODE=9 or CUSTOMER_STATUS_CODE!=9) then '2016'
when EXTRACT(YEAR FROM BUILD_DATE)<2016 and (EXTRACT(YEAR FROM CANCEL_DATE)>2015 and CUSTOMER_STATUS_CODE=9 or CUSTOMER_STATUS_CODE!=9) then '2015'
end) as period
from FCT_CUSTOMER t1
)t
EXTRACT(YEAR FROM BUILD_DATE)<2017 and (EXTRACT(YEAR FROM CANCEL_DATE)>2016 ) then '2016'
when EXTRACT(YEAR FROM BUILD_DATE)<2016 and (EXTRACT(YEAR FROM CANCEL_DATE)>2015 )
我是这样想的,在17年前立户而且是16年后(包括到现在都没销户的CUSTOMER_STATUS_CODE!=9)销户的都算是16年的户数。但是表中还到现在没有销户那些人,销户时间是空的,但是他的CUSTOMER_STATUS_CODE字段的值是不为9的。所以就有了(EXTRACT(YEAR FROM CANCEL_DATE)>2016 and CUSTOMER_STATUS_CODE=9 or CUSTOMER_STATUS_CODE!=9) 这个约束,因为and优先级比or高,所以先判断已经销户的而且是16年后销户(EXTRACT(YEAR FROM CANCEL_DATE)>2016 and CUSTOMER_STATUS_CODE=9)在判断或者是到现在都没销户的(CUSTOMER_STATUS_CODE!=9)。
例如
No CUSTOMER_STATUS_CODE BUILD_DATE CANCEL_DATE
1 1 2013
2 9 2013 2016
3 1 2016
4 9 2015 2019
5 9 2016 2016这的话2016年的户数结果应该是3 (分别是134); 2015年的户数结果应该是3(分别是124)。
按照我这种写法得到的结果是3和1,所有是不对的
是的,我也知道case……when的原因导致2015年数据不正确,但是我又没其他方法可以使结果满足需求。所以来请教。
是的,我也知道case……when的原因导致2015年数据不正确,但是我又没其他方法可以使结果满足需求。所以来请教。
如果允许的话,可以对每一年的统计单独使用一个 case when