有一张表:账户表
客户号         账户号              账号行   账号状态(2为正常,3为撤销)
2000722879  1002600134122000126 6901 2
2004718123  43010154740001097 4301 2
2000707822  69010154740007360 6901 2
2000370689  8314122007373          8901 2
2000370697  8314122006479          8901 3
2000372328  8314090001355          8901 2
2000372328  89100154700000034 8901 3
2000708622  69010154700002076 6901 3
2000708622  43010155300002841 4301 2
2000370873  8314121000959          8901 2
2002681749  89010155200000355 8901 2
2000714811  69010154700001080 6901 2
2000715496  69010154740007011 6901 2
2000717182  1002600134100010494 6901 2
2000718621  1002600134100011425 6901 2
2000722637  69010154700002197 6901 2
2000722670  1002600134100005694 6901 2一个客户号对应多个账号,如果账号所在的账户行为同一个行,视为一个客户,多个账号行视为多个客户
(如客户2000372328下有2个账号,但账户行都在8901,视为一个客户,账号状态分别为2,3,对应客户状态为2。
    客户2000708622视为2个客户,账号状态分别为2,3,对应客户号状态也为2,3)。求:状态为2的客户号有几个,为3的客户号有几个?    谢谢

解决方案 »

  1.   

    select sum(case when (t2.账号状态 = 2) then 1 else 0 end) as "正常",
           sum(case when (t2.账号状态 = 3) then 1 else 0 end) as "撤销"
      from (select t.客户号, t.账号行, min(t.账号状态) as "账号状态"
              from table1 t1
             group by t.账号行, t.客户号) t2;
      

  2.   

    select 账号状态, count(客户号)
        from (select 客户号,
                     账户号,
                     账号行,
                     min(账号状态) over(partition by 客户号, 账号行) as 账号状态
                from test_t)
       group by 账号状态
      

  3.   

    修改一下
     select 账号状态, count(客户号)
        from (select distinct 客户号,
                     账户号,
                     账号行,
                     min(账号状态) over(partition by 客户号, 账号行) as 账号状态
                from test_t)
       group by 账号状态
      

  4.   


    怀疑你没认真看,我的脚本最后结果就是正常 14,撤销 2
    select sum(case when (t2.账号状态 = 2) then 1 else 0 end) as "正常",
           sum(case when (t2.账号状态 = 3) then 1 else 0 end) as "撤销"
      from (select t1.客户号, t1.账号行, min(t1.账号状态) as "账号状态"
              from test_table t1
             group by t1.账号行, t1.客户号) t2;