SQL代码详解:用户费用统计脚本解读
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脚本主要实现以下功能:
- 统计用户数量和总费用: 根据不同的产品线和渠道,统计每个省份的用户数量和总费用。2. 插入数据到分区表: 将统计结果插入到名为
temp_yt_sxsj的分区表中,分区字段为month_id。
代码逻辑:
- 外层查询: 将最终统计结果插入到
temp_yt_sxsj表中,并根据prov_id和chnl_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_id和user_id相等。4. 条件筛选: 在每个子查询中,都使用了CASE WHEN语句根据level1_id、level2_id、is_kd、is_gh和is_zq等字段对数据进行分类。5. 聚合操作: 在每个子查询中,都使用了COUNT(DISTINCT ...)函数统计用户数量,使用SUM(...)函数统计总费用。
总结:
这段SQL代码结构清晰,逻辑严谨,通过巧妙地使用子查询、连接操作和条件筛选等技术,实现了对用户费用数据的统计和分析,并将结果存储到分区表中,方便后续查询和分析。
原文地址: https://www.cveoy.top/t/topic/fBdv 著作权归作者所有。请勿转载和采集!