Sql中union all函数的使用场景和日常代码分享
作者:mmseoamin日期:2024-01-21

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • union all函数的使用和日常代码分享`
  • 一、union all 的基本用法
  • 二、union all 的基本用法
    • 1.例如
    • 2.分享日常使用的union all代码用法如下(示例):
    • 三、 总结

      union all函数的使用和日常代码分享`

      注:union all是允许有重复值的话,如果查询的数据有重复值,可以使用union all,最后如果需要汇总数据可以对数据进行去重处理即可,如果无重复数据可以采用union。


      `

      一、union all 的基本用法

      注:每一个查询语句块需输出相同的字段以及字段顺序,方便后续汇总以及程序运行的时候不容易出错。

      二、union all 的基本用法

      1.例如

      代码如下(示例):

      语句块1
      union all
      语句块2
      union all
      ...
      语句块n
      

      2.分享日常使用的union all代码用法如下(示例):

      (1)需求口径说明

      ①此业务区分8个方案,且同一个号码可以同时办理多个方案。

      ②统计前必须限制一个条件(SX_5G_TERM_IND=1)用来汇总特定业务数据。

      ③若同一个号码同时办理了多个方案,可以根据方案的价值来设置优先级,并进行去重处理,来保证高价值方案办理量能被精准统计。

      (2)表字段(业务表名:XXX_D)

      城市号码门店编码特征码门店名称限定业务口径门店类型业务名称办理月份办理日期
      BRANCHNUMBERCHNL_CDPATTERNCHNL_NAMSX_5G_TERM_INDTERM_TYPTERM_CONTR_NAMMONTHDAY

      (3)Sql脚本编写

      ①变量赋值

      v_day:办理日期:xxxx-xx-xx(例:20230223)

      v_month:办理月份:xxxx-xx

      ②脚本编写

      -- 首先限定特定业务口径
      drop table if exists qdzx_a_dr_sx_pers_term_contr_cnt_v1 purge;
      create table qdzx_a_dr_sx_pers_term_contr_cnt_v1 as
      select
              branch,
              NUMBER,
              TERM_CONTR_TYP,           --业务名称
              CHNL_CD,                  --门店编码
              PATTERM,                  --特征码
              CHNL_NAM,                 --门店名称
              SX_5G_TERM_IND,           --限定业务口径
              TERM_CONTR_NAM,           --方案名称
              ACCEPT_MO,                --办理月份
              CONT_ACCEPT_DT,           --办理日期
              month,
              day
      from
      XXX_D
      where SX_5G_TERM_IND=1 and TERM_TYP='xx' and month=${v_month};
      -- 数据处理(设置每项业务进行优先级)
      drop table if exists qdzx_a_dr_sx_pers_term_contr_cnt_v2 purge;
      create table qdzx_a_dr_sx_pers_term_contr_cnt_v2 as
      select 
              branch,
              NUMBER,
              TERM_CONTR_TYP,           --业务名称
              CHNL_CD,                  --门店编码
              PATTERM,                  --特征码
              CHNL_NAM,                 --门店名称
              SX_5G_TERM_IND,           --限定业务口径
              TERM_CONTR_NAM,           --方案名称
              ACCEPT_MO,                --办理月份
              CONT_ACCEPT_DT,           --办理日期
              month,
              day
             case when TERM_CONTR_TYP='业务3' then '3'
                     when TERM_CONTR_TYP='业务6' then '6'
                     when TERM_CONTR_TYP='业务7' then '7'
                     when TERM_CONTR_TYP='业务8' then '8'
                     else '' end as priority    --设置业务优先级
      from qdzx_a_dr_sx_pers_term_contr_cnt_v1 
      where TERM_CONTR_TYP in('业务3','业务6','业务7','业务8') and CONT_ACCEPT_DT<=${v_day}   
      union all
      select 
              branch,
              NUMBER,
              TERM_CONTR_TYP,           --业务名称
              CHNL_CD,                  --门店编码
              PATTERM,                  --特征码
              CHNL_NAM,                 --门店名称
              SX_5G_TERM_IND,           --限定业务口径
              TERM_CONTR_NAM,           --方案名称
              ACCEPT_MO,                --办理月份
              CONT_ACCEPT_DT,           --办理日期
              month,
              day
             case when TERM_CONTR_TYP='业务1' then '1'
                     when TERM_CONTR_TYP='业务2' then '2'
                     when TERM_CONTR_TYP='业务4' then '4'
                     when TERM_CONTR_TYP='业务5' then '5'
                     else '' end as priority
      from qdzx_a_dr_sx_pers_term_contr_cnt_v1 
      where TERM_CONTR_TYP in('业务1','业务2','业务3','业务4') and TERM_CONTR_NAM not like "%ZD_质押%" and TERM_CONTR_NAM not like "%ZD质押%" and CONT_ACCEPT_DT<=${v_day} 
      --处理其中业务中的某个小类
      union all
      select 
              branch,
              NUMBER,
              TERM_CONTR_TYP,           --业务名称
              CHNL_CD,                  --门店编码
              PATTERM,                  --特征码
              CHNL_NAM,                 --门店名称
              SX_5G_TERM_IND,           --限定业务口径
              TERM_CONTR_NAM,           --方案名称
              ACCEPT_MO,                --办理月份
              CONT_ACCEPT_DT,           --办理日期
              month,
              day
              '1' as priority
      from qdzx_a_dr_sx_pers_term_contr_cnt_v1 
      where TERM_CONTR_TYP in('业务1') and (TERM_CONTR_NAM  like "%ZD_质押%" or TERM_CONTR_NAM  like "%ZD质押%" ) and CONT_ACCEPT_DT<=${v_day} 
      ;
      -- 按方案大类优先级去重(保留唯一办理)
      drop table if exists qdzx_a_dr_sx_pers_term_contr_cnt_v3 purge;
      create table qdzx_a_dr_sx_pers_term_contr_cnt_v3 as
      select a.* 
      from (
          select 
              branch,
              NUMBER,
              TERM_CONTR_TYP,           --业务名称
              CHNL_CD,                  --门店编码
              PATTERM,                  --特征码
              CHNL_NAM,                 --门店名称
              SX_5G_TERM_IND,           --限定业务口径
              TERM_CONTR_NAM,           --方案名称
              ACCEPT_MO,                --办理月份
              CONT_ACCEPT_DT,           --办理日期
              month,
              day,
              row_number() over(partition by NUMBER order by priority) rn     --对方案大类进行优先级去重
          from qdzx_a_dr_sx_pers_term_contr_cnt_v2
      ) a 
      where a.rn=1
      ;
      -- 数据汇总入库
      insert overwrite table TXB_QDZX_SX_PERS_TERM_CONTR_DTL_V1 partition(day=${v_day}) --设置分区条件
      select 
              branch,
              CHNL_CD,             --门店编码
              CHNL_NAM,            --门店名称
              term_chnl_signa,     --特征码
              count(distinct case when TERM_CONTR_TYP='业务1' and ACCEPT_MO=${v_month} then NUMBER end) as mon_usr_xx1_sx_cnt,
              count(distinct case when TERM_CONTR_TYP='业务2' and ACCEPT_MO=${v_month} then NUMBER end) as mon_usr_xx2_sx_cnt,
              count(distinct case when TERM_CONTR_TYP='业务3' and ACCEPT_MO=${v_month} then NUMBER end) as mon_usr_xx3_sx_cnt,
              count(distinct case when TERM_CONTR_TYP='业务4' and ACCEPT_MO=${v_month} then NUMBER end) as mon_usr_xx4_sx_cnt,
              count(distinct case when TERM_CONTR_TYP='业务5' and ACCEPT_MO=${v_month} then NUMBER end) as mon_usr_xx5_sx_cnt,
              count(distinct case when TERM_CONTR_TYP='业务6' and ACCEPT_MO=${v_month} then NUMBER end) as mon_usr_xx6_sx_cnt,
              count(distinct case when TERM_CONTR_TYP='业务7' and ACCEPT_MO=${v_month} then NUMBER end) as mon_usr_xx7_sx_cnt,
              count(distinct case when TERM_CONTR_TYP='业务8' and ACCEPT_MO=${v_month} then NUMBER end) as mon_usr_xx8_sx_cnt,
              count(distinct case when ACCEPT_MO=${v_month} then NUMBER end) as mon_usr_sx_cnt
      from qdzx_a_dr_sx_pers_term_contr_cnt_v3
      group by
      branch,CHNL_CD,CHNL_NAM,term_chnl_signa;
      -- 删除虚拟表
      drop table if exists qdzx_a_dr_sx_pers_term_contr_cnt_v1 purge;
      drop table if exists qdzx_a_dr_sx_pers_term_contr_cnt_v2 purge;
      drop table if exists qdzx_a_dr_sx_pers_term_contr_cnt_v3 purge;
      

      三、 总结

      ①union all内部的select语句必须拥有相同数量的列,列也必须拥有相似的数据类型。

      ②每条SELECT语句中列的顺序必须相同。