SQL代码解析:按地区和渠道统计用户发展情况

本篇解析一段SQL代码,该代码用于从temp_lgl_gw_dev表中提取数据,并按地区和渠道统计用户发展情况,最终插入到temp_lgl_gw_dev_result表中。

insert overwrite table temp_lgl_gw_dev_result partition (month_id = '${v_month}')
select '全国' prov_part,
       chnl_type,
       sum(cast(user_num as int)) user_num,--本年累计新发展用户数
       sum(cast(innet_num as int)) innet_num,--本年新发展用户统计当月在网用户数
       sum(cast(acct_num as int)) acct_num,--本年新发展用户统计当月出账用户数
       sum(cast(m_fee as double)) m_fee,--本年新发展用户统计当月出账收入
       sum(cast(total_fee as double)) total_fee--本年新发展用户本年累计出账收入
from temp_lgl_gw_dev
where month_id = '${v_month}'
group by '全国',chnl_type
union all
select b.prov_part,
       a.chnl_type,
       sum(cast(user_num as int)) user_num,
       sum(cast(innet_num as int)) innet_num,
       sum(cast(acct_num as int)) acct_num,
       sum(cast(m_fee as double)) m_fee,
       sum(cast(total_fee as double)) total_fee
from (
         select prov_id,
                chnl_type,
                total_fee,
                user_num,
                innet_num,
                acct_num,
                m_fee
         from temp_lgl_gw_dev
              where month_id = '${v_month}'
     ) a
         left join
     (
         select prov_id,
                prov_desc,
                case
                    when ord_id3 <= 10 then '北10'
                    when ord_id3 > 10 then '南21'
                    end prov_part
         from DIM_PROV_ORD
     ) b
     on a.prov_id = b.prov_id
group by b.prov_part,a.chnl_type
union all
select b.prov_desc prov_part ,
       chnl_type,
       user_num,
       innet_num,
       acct_num,
       m_fee,
       total_fee
from temp_lgl_gw_dev a
left join
(
         select prov_id,
                prov_desc
         from DIM_PROV_ORD
     ) b
     on a.prov_id = b.prov_id
where month_id = '${v_month}';

代码拆解:

该代码由三个 SELECT 语句通过 UNION ALL 连接而成,每个语句都统计了指定范围内的数据:

  1. 全国数据统计:

    • temp_lgl_gw_dev 表中筛选出 month_id 等于 ${v_month} 的数据。
    • 按渠道类型 (chnl_type) 进行分组,并对用户数、收入等指标进行求和。
    • 结果中 prov_part 字段统一设置为 '全国'。
  2. 按南北区域统计:

    • 首先从 temp_lgl_gw_dev 表中筛选出指定月份的数据,并将其命名为子查询 a
    • DIM_PROV_ORD 表中读取地区信息,并根据 ord_id3 字段将地区划分为 '北10' 和 '南21' 两个区域,并将其命名为子查询 b
    • ab 通过 prov_id 字段进行左连接,并将连接后的结果按区域 (prov_part) 和渠道类型 (chnl_type) 进行分组,统计各项指标的总和。
  3. 按省份统计:

    • 与第二部分类似,也是将 temp_lgl_gw_dev 表和 DIM_PROV_ORD 表进行左连接,但这次直接使用 prov_desc 字段作为地区标识 (prov_part),并按其和渠道类型进行分组统计。

总结:

该SQL代码通过三次查询分别统计了全国、南北区域和各个省份的用户发展情况,并将结果合并到一起插入到目标表中,为后续的数据分析提供了基础数据。

代码优化建议:

  • 可以考虑使用 WITH AS 语句将重复使用的子查询定义为公用表表达式 (CTE), 提高代码可读性和维护性。
  • 可以根据实际情况考虑是否需要使用 LEFT JOIN,如果确定两个表有关联数据,可以使用 INNER JOIN 提高查询效率。
  • 可以对SQL代码进行必要的注释,方便他人理解代码逻辑。
SQL代码解析:按地区和渠道统计用户发展情况

原文地址: https://www.cveoy.top/t/topic/fBxe 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录