欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle中行转列、列转行的使用

程序员文章站 2022-07-13 17:14:09
...

问题描述:我有两张表KB22、KC24,包含的关键字段为KB22:AAB299 省份编码 AKE149 医保基金支付 AAZ216 交易流水号  AAE043 清算期别,;KC24:AKC021 人群类别(职工【11,21】、居民【代码表7开头的都是居民】),AKC351 交易流水号,YAB003 参保地行政区代码,YAB600 就医地行政区代码  现在需要做的是统计出同一个省份医保基金支付的总额以及同一个省份职工和居民的医保基金支付总额。

很显然,这两张表的联系为交易流水号:

1、首先比如我统计出201708期别

select *from KB22 A, KC24 B where A.AAZ216 = B.AKC351 and A.AAE043 = '201708';
这是将201708期别的数据统计出来

2、按照省份分组

select substr(B.YAB003,0,2) YAB003, sum(A.AKE149) AKE149 from KB22 A, KC24 B where A.AAZ216 = B.AKC351 and A.AAE043 = '201708' group by substr(B.YAB003,0,2);

这是按照省份进行了分组,这里对AAB299截取前两位是因为统筹区编码一般形如:220100,220200....,这里有个问题,省份里还包含了职工和居民,所以还得对人群类别进行分组

3、按照人群类别分组

select substr(B.YAB003,0,2) YAB003, sum(A.AKE149) AKE149, B.AKC021 from KB22 A, KC24 B where A.AAZ216 = B.AKC351 and A.AAE043 = '201708' group by substr(B.YAB003,0,2),B.AKC021;

Oracle中行转列、列转行的使用

由于这里的AKC021都为21,所有没达到预期效果,因为前面说了,AKC021中11,21为职工,7开头的为居民,虽然现在没遇到,但是还得考虑进去,先对11,21,7开头进行处理

4、处理人群类别

select substr(B.YAB003, 0, 2) YAB003,
       sum(A.AKE149) AKE149,
       (case
         when B.AKC021 = '21' then
          '11'
         when substr(B.AKC021, 0, 1) = '7' then
          '70'
         else
          B.AKC021
       end) AKC021
  from KB22 A, KC24 B
 where A.AAZ216 = B.AKC351
   and A.AAE043 = '201708'
 group by substr(B.YAB003, 0, 2), B.AKC021;

Oracle中行转列、列转行的使用

就是将21归为11组,7开头的归为70组

4、进行行转列

select A.AAB299,
       A.AKC022 + A.AKC023 AKE149,
       A.AKC022,
       case
         when A.AKC023 is null then
          0
         else
          A.AKC023
       end AKC023
  from (select substr(A.aab301, 0, 2) AAB299,
               sum(A.ake149) AKE149,
               (case
                 when B.akc021 = '21' then
                  '11'
                 when substr(B.akc021, 0, 1) = '7' then
                  '70'
                 else
                  B.akc021
               end) AKC021
          from kb22 A, kc24 B
         where A.Aaz216 = B.akc351
           and A.aae043 = '201708'
         group by substr(A.aab301, 0, 2), B.akc021) pivot(sum(AKE149) for akc021 in('11'
                                                                                    akc022,
                                                                                    '70'
                                                                                    akc023)) A
Oracle中行转列、列转行的使用

5、最后页面的效果

Oracle中行转列、列转行的使用