求教分组求用户表中每年已经立户但没有销户客户数量。例如某客户可能在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年的。我该怎么写才符合要求?

解决方案 »

  1.   

    select t.period,count(*) as value
    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 吗?
      

  2.   

    你的意思是2015的结果减掉2016年的结果就是2015年的数目?那可以这么写?
    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
      

  3.   


    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)。
      

  4.   

    不是的,我的意思是怎么样计算出15年的户数和16年的户数。我这个写法是不正确的,它只是计算了16年的户数,然后在剩下那些人中计算了符合15年的户数。我要的结果这样的:
    例如   
    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,所有是不对的
      

  5.   

    你的条件没错,只是这里不能这么用case……when,因为15,16年之间室友重复数据,但是case……when只会进入到一个分支,这也就是为什么在15年统计不到部分数据的原因。
      

  6.   


    是的,我也知道case……when的原因导致2015年数据不正确,但是我又没其他方法可以使结果满足需求。所以来请教。
      

  7.   


    是的,我也知道case……when的原因导致2015年数据不正确,但是我又没其他方法可以使结果满足需求。所以来请教。
    如果允许的话,可以对每一年的统计单独使用一个 case when