现在的位置: 首页 > 综合 > 正文

导数据语句和思路

2013年10月09日 ⁄ 综合 ⁄ 共 4590字 ⁄ 字号 评论关闭
       毕业后到现在,一直在准备数据仓库,这几天在导数据阶段,从开始什么也不知道到现在变着法子好让数据导的最快,经历了许多思维的变换,真的喜欢上了这份工作!下面是对这段时间导数据的一个思路总结。

      由于我们的仓库表只有一张表,通过字段的条件互斥来区分各类人员,也即度量。所以当我要针对某一主题建立事实表时候,判断各类人员成为了导数据的关键点!

      我导的事实表里有三个度量,判断条件各不一样,所以开始为怎么样产生这三个度量值而烦恼,由此产生以下几种方法:

      方法一:先按照一个度量导数据,由于维度一样,所以可以使用UPDATE更新事实表:
      代码如下:
      insert into fjc01j2
             select aae043, --数据期别
         aab301, --区县代码
         aab019, --单位类型编码
         aab020, --经济类型编码
         aab022, --行业代码
         aac013, --原用工形式编码
         aac014, --专业技术职务代码
         aac015, --职业资格等级
         case when ajc00b<0 then -1 when ajc00b is null then 999 else ajc00b end as ajc00b, --失业登记前连续工龄代码
         value(ajc093,'90'), --失业原因代码
         aca111, --原从事职业代码
         count(1) as VAC501, --失业人数
         count(1) as VAC502,  --登记失业人数
         count(1) as VAC503 --领取失业保险金人数
              from jf11
              group by
         aae043, --数据期别
         aab301, --区县代码
         aab019, --单位类型编码
         aab020, --经济类型编码
         aab022, --行业代码
         aac013, --原用工形式编码
         aac014, --专业技术职务代码
         aac015, --职业资格等级
         ajc00b, --失业登记前连续工龄代码
         ajc093, --失业原因代码
         aca111;  --原从事职业代码

--建立fjc01j2_temp1,用于存放领取失业保险金人数
create table fjc01j2_temp1  as
             select
         aae043, --数据期别
         aab301, --区县代码
         aab019, --单位类型编码
         aab020, --经济类型编码
         aab022, --行业代码
         aac013, --原用工形式编码
         aac014, --专业技术职务代码
         aac015, --职业资格等级
         case when ajc00b<0 then -1 end, --失业登记前连续工龄代码
         ajc093, --失业原因代码
         aca111, --原从事职业代码
         count(1) as vac502  --登记失业人数
              from jf11
        where coalesce(AJC093,'0') <>'0' AND
coalesce(AJC094,'0') <>'0' AND coalesce(AJC00A,'0') = '0'
              group by
           aae043, --数据期别
           aab301, --区县代码
           aab019, --单位类型编码
           aab020, --经济类型编码
           aab022, --行业代码
           aac013, --原用工形式编码
           aac014, --专业技术职务代码
           aac015, --职业资格等级
           ajc00b, --失业登记前连续工龄代码
           ajc093, --失业原因代码
           aca111; --原从事职业代码

update fjc01j2 f1
  set vac502=(select vac502
              from fjc01j2_temp1 temp
              where f1.aae043=temp1.aae043,
                    f1.aab301=temp1.aab301,
                    f1.aab019=temp1.aab019,
                    f1.aab020=temp1.aab020,
                    f1.aab022=temp1.aab022,
                    f1.aac013=temp1.aac013,
                    f1.aac014=temp1.aac014,
                    f1.aac015=temp1.aac015,
                    f1.ajc00b=temp1.ajc00b,
                    f1.ajc093=temp1.ajc093,
                    f1.aca111=temp1.aca111);

--建立fjc01j2_temp2,用于存放领取失业保险金人数
create table fjc01j2_temp2  as
    select
         aae043, --数据期别
         aab301, --区县代码
         aab019, --单位类型编码
         aab020, --经济类型编码
         aab022, --行业代码
         aac013, --原用工形式编码
         aac014, --专业技术职务代码
         aac015, --职业资格等级
         case when ajc00b<0 then -1 end, --失业登记前连续工龄代码
         ajc093, --失业原因代码
         aca111, --原从事职业代码
         count(1) as vac503  --登记失业人数
    from jf11
    where value(AJC167,0) <> 0
    group by
           aae043, --数据期别
           aab301, --区县代码
           aab019, --单位类型编码
           aab020, --经济类型编码
           aab022, --行业代码
           aac013, --原用工形式编码
           aac014, --专业技术职务代码
           aac015, --职业资格等级
           ajc00b, --失业登记前连续工龄代码
           ajc093, --失业原因代码
           aca111; --原从事职业代码

update fjc01j2 f1
  set vac503=(select vac503
              from fjc01j2_temp2 temp2
              where f1.aae043=temp2.aae043,
                    f1.aab301=temp2.aab301,
                    f1.aab019=temp2.aab019,
                    f1.aab020=temp2.aab020,
                    f1.aab022=temp2.aab022,
                    f1.aac013=temp2.aac013,
                    f1.aac014=temp2.aac014,
                    f1.aac015=temp2.aac015,
                    f1.ajc00b=temp2.ajc00b,
                    f1.ajc093=temp2.ajc093,
                    f1.aca111=temp2.aca111);
 注释: DB2中不允许向上面那样创建临时表,所以改创建视图!

方法二:思路和上面一样,只是不创建临时表,直接使用仓库目录表(代码略)

方法三:直接产生三个度量,使用case when 语句。该方法需要仓库目录表和事实表能在一个用户下都能访问!
insert into fjc01j2
select aae043,
          aab301,
          aab019,
          aab020,
          aab022,
          aac013,
          aac014,
          aac015,
          case when ajc00b<0 then -1 when ajc00b is null then 999 else ajc00b end as ajc00b,
          coalesce(ajc093,'90') as ajc093,
          aca111,
          count(1) as vac501,
          sum(case when coalesce(ajc093,'0')<>'0'
                           and coalesce(ajc094,'0')<>'0'
                           and coalesce(ajc00a,'0')='0'
                           then 1 else 0 end) as vac502,
         sum(case when coalesce(ajc167,0)<>0 then 1 else 0 end) as vac503
from jf11
group by aae043,
             aab301,
             aab019,
             aab020,
             aab022,
             aac013,
             aac014,
             aac015,
             case when ajc00b<0 then -1
                    when ajc00b is null then 999
                    else ajc00b end,
            coalesce(ajc093,'90'),
            aca111

 

抱歉!评论已关闭.