SQL代码详解:用户费用统计脚本解读

本文将详细分析以下SQL脚本,该脚本用于统计不同产品线和渠道的用户数量和总费用,并将其插入到分区表中。sql-- 执行脚本--p_acct_user_feeinsert overwrite table temp_yt_sxsj partition (month_id = '${v_month}')select a.prov_id, a.chnl_type, a.user_num, a.total_feefrom ( select a.prov_id, case when level1_id = 'P03' then '基础数据产品线(全渠道)' when level2_id = 'P0401' then '互联网专线产品系列(全渠道)' else '其他' end chnl_type, count(distinct a.user_id) user_num, sum(b.total_fee) total_fee from ( select prov_id, cbss_user_id user_id, level1_id, level2_id from temp_yt_gw_user where month_id='${v_month}' group by prov_id, cbss_user_id, level1_id, level2_id

          ) a                  left join              (                  select user_id,                         prov_id,                         sum(total_fee) total_fee                  from dwa.dwa_v_m_cus_cb_sing_charge  --linjh 由db_der.DWA_V_M_CUS_CB_CHARGE修改为dwa.dwa_v_m_cus_cb_sing_charge                  where month_id = '${v_month}'                  and substr(device_number,1,4)!='1454' and  substr(device_number,1,4)!='1457' --linjh 新增的查询条件                  group by user_id, prov_id              ) b              on a.prov_id = b.prov_id and a.user_id = b.user_id         group by a.prov_id,                  case                      when level1_id = 'P03' then '基础数据产品线(全渠道)'                      when level2_id = 'P0401' then '互联网专线产品系列(全渠道)'                      else '其他'                      end         union all         select a.prov_id,                case                    when level1_id = 'P03' then '基础数据产品线(政企渠道)'                    when level2_id = 'P0401' then '互联网专线产品系列(政企渠道)'                    when is_kd = '1' then '普通宽带(政企渠道)'                    when is_gh = '1' then '固定电话(政企渠道)'                    else '其他'                    end                   chnl_type,                count(distinct a.user_id) user_num,                sum(b.total_fee) total_fee         from (                  select prov_id,                     cbss_user_id    user_id,                         level1_id,                         level2_id,                         service_type,                         is_kd,                         is_gh                  from temp_yt_gw_user                  where  month_id='${v_month}' and  is_zq = '1'                  group by prov_id, cbss_user_id, level1_id, level2_id, service_type, is_kd, is_gh              ) a                  left join              (                  select user_id,                         prov_id,                         sum(total_fee) total_fee                  from dwa.dwa_v_m_cus_cb_sing_charge  --linjh 由db_der.DWA_V_M_CUS_CB_CHARGE修改为dwa.dwa_v_m_cus_cb_sing_charge                  where month_id = '${v_month}'                  and substr(device_number,1,4)!='1454' and  substr(device_number,1,4)!='1457' --linjh 新增的查询条件                  group by user_id, prov_id              ) b              on a.prov_id = b.prov_id and a.user_id = b.user_id         group by a.prov_id,                  case                      when level1_id = 'P03' then '基础数据产品线(政企渠道)'                      when level2_id = 'P0401' then '互联网专线产品系列(政企渠道)'                      when is_kd = '1' then '普通宽带(政企渠道)'                      when is_gh = '1' then '固定电话(政企渠道)'                      else '其他'                      end         union all         select a.prov_id,                case                    when level1_id = 'P03' or level2_id = 'P0401' then '双线产品(全渠道)'                    else '其他'                    end                   chnl_type,                count(distinct a.user_id) user_num,                sum(b.total_fee) total_fee         from (                  select prov_id,                      cbss_user_id   user_id,                         level1_id,                         level2_id                  from temp_yt_gw_user                  where  month_id='${v_month}'                  group by prov_id, cbss_user_id, level1_id, level2_id              ) a                  left join              (                  select user_id,                         prov_id,                         sum(total_fee) total_fee                  from dwa.dwa_v_m_cus_cb_sing_charge  --linjh 由db_der.DWA_V_M_CUS_CB_CHARGE修改为dwa.dwa_v_m_cus_cb_sing_charge                  where month_id = '${v_month}'                  and substr(device_number,1,4)!='1454' and  substr(device_number,1,4)!='1457' --linjh 新增的查询条件                  group by user_id, prov_id              ) b              on a.prov_id = b.prov_id and a.user_id = b.user_id         group by a.prov_id,                  case                      when level1_id = 'P03' or level2_id = 'P0401' then '双线产品(全渠道)'                      else '其他'                      end         union all         select a.prov_id,                case                    when level1_id = 'P03' or level2_id = 'P0401' then '双线产品(政企渠道)'                    else '其他'                    end                   chnl_type,                count(distinct a.user_id) user_num,                sum(b.total_fee) total_fee         from (                  select prov_id,                     cbss_user_id    user_id,                         level1_id,                         level2_id                  from temp_yt_gw_user                  where  month_id='${v_month}' and is_zq = '1'                  group by prov_id, cbss_user_id, level1_id, level2_id              ) a                  left join              (                  select user_id,                         prov_id,                         sum(total_fee) total_fee                  from dwa.dwa_v_m_cus_cb_sing_charge  --linjh 由db_der.DWA_V_M_CUS_CB_CHARGE修改为dwa.dwa_v_m_cus_cb_sing_charge                  where month_id = '${v_month}'                  and substr(device_number,1,4)!='1454' and  substr(device_number,1,4)!='1457' --linjh 新增的查询条件                  group by user_id, prov_id              ) b              on a.prov_id = b.prov_id and a.user_id = b.user_id         group by a.prov_id,                  case                      when level1_id = 'P03' or level2_id = 'P0401' then '双线产品(政企渠道)'                      else '其他'                      end     ) awhere a.chnl_type <> '其他'group by a.prov_id, a.chnl_type, a.user_num, a.total_feeorder by a.prov_id, a.chnl_type;

代码功能:

该SQL脚本主要实现以下功能:

  1. 统计用户数量和总费用: 根据不同的产品线和渠道,统计每个省份的用户数量和总费用。2. 插入数据到分区表: 将统计结果插入到名为temp_yt_sxsj的分区表中,分区字段为month_id

代码逻辑:

  1. 外层查询: 将最终统计结果插入到temp_yt_sxsj表中,并根据prov_idchnl_type进行排序。2. 子查询a: 该子查询是整个脚本的核心,它通过UNION ALL操作合并了四部分查询结果。每部分查询都使用了相同的逻辑,只是条件略有不同。 - 子查询a的第一部分: 统计全渠道基础数据产品线和互联网专线产品系列的用户数量和总费用。 - 子查询a的第二部分: 统计政企渠道基础数据产品线、互联网专线产品系列、普通宽带和固定电话的用户数量和总费用。 - 子查询a的第三部分: 统计全渠道双线产品用户数量和总费用。 - 子查询a的第四部分: 统计政企渠道双线产品用户数量和总费用。3. 连接操作: 在每个子查询中,都使用了LEFT JOIN操作将temp_yt_gw_user表和dwa.dwa_v_m_cus_cb_sing_charge表连接起来。连接条件是prov_iduser_id相等。4. 条件筛选: 在每个子查询中,都使用了CASE WHEN语句根据level1_idlevel2_idis_kdis_ghis_zq等字段对数据进行分类。5. 聚合操作: 在每个子查询中,都使用了COUNT(DISTINCT ...)函数统计用户数量,使用SUM(...)函数统计总费用。

总结:

这段SQL代码结构清晰,逻辑严谨,通过巧妙地使用子查询、连接操作和条件筛选等技术,实现了对用户费用数据的统计和分析,并将结果存储到分区表中,方便后续查询和分析。


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

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