with t as(
select 'a' ids, '201209' shijian ,'test7' leibie from dual
union all
select 'a' ids, '201209' shijian ,'test6' leibie from dual
union all
select 'a' ids, '201209' shijian ,'test5' leibie from dual
union all
select 'a' ids, '201209' shijian ,'test6' leibie from dual
union all
select 'a' ids, '201208' shijian ,'test6' leibie from dual
union all
select 'a' ids, '201208' shijian ,'test5' leibie from dual
union all
select 'a' ids, '201207' shijian ,'test5' leibie from dual
union all
select 'a' ids, '201206' shijian ,'test5' leibie from dual
union all
select 'a' ids, '201205' shijian ,'test4' leibie from dual
union all
select 'a' ids, '201205' shijian ,'test5' leibie from dual
union all
select 'a' ids, '201205' shijian ,'test2' leibie from dual
union all
select 'a' ids, '201205' shijian ,'test1' leibie from dual
union all
select 'b' ids, '201209' shijian ,'test7' leibie from dual
union all
select 'b' ids, '201209' shijian ,'test8' leibie from dual
union all
select 'b' ids, '201209' shijian ,'test5' leibie from dual
union all
select 'b' ids, '201209' shijian ,'test6' leibie from dual
union all
select 'b' ids, '201208' shijian ,'test6' leibie from dual
union all
select 'b' ids, '201208' shijian ,'test5' leibie from dual
)
select ids,count(distinct leibie) shuliang
from (
select ids,leibie from t where shijian='201209' 
minus
select ids,leibie from t where shijian<'201209')
group by ids在表t中,存放的是每个月的每个id的各种类型的流水;
现在要统计出某个月份每个id分别比该id以前的流水,多出那些类别的流水;
比如要统计201209月份的
结果是:
ids  shuliang
a     1
b     2ids=a的只比以前的流水多出一个leibie='test7'的
ids=b的比以前的流水多出两个leibie='test7'跟leibie='test8'上面的sql可以实现这种效果,只是t表将来数据会越来越多,这样写效率不知道怎样,另外这是为了做一个查询统计,还要统计t表其他列的信息,这样对t表就要查询多次了

解决方案 »

  1.   

    SELECT t1.ids,COUNT(DISTINCT t1.leibie)
      FROM t t1
     WHERE t1.shijian = '201209'
       AND NOT EXISTS ( SELECT 1
                          FROM t t2 
                         WHERE t2.ids = t1.ids 
                           AND t2.leibie = t1.leibie
                           AND t2.shijan < '201209')
     GROUP BY t1.ids