From 3a03ba1ad2c18b4464572c32f08529a039a96abb Mon Sep 17 00:00:00 2001 From: "zhuchenwu@chenwuzhu.cn" Date: Sat, 2 May 2026 06:48:24 +0000 Subject: [PATCH] 20260501 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DBR更新,包含haoyi的调整 --- EC/03 ec_load_data.ipynb | 624 ++++++++++++------ Retail/13 DM_TF_EXT_RETAIL_SALES.sql | 81 +++ UNIONALL/DM_TF_EXT_UNIONALL_MARKET_SALES.sql | 145 +++- UNIONALL/DM_TF_EXT_UNIONALL_SALES.sql | 2 +- UNIONALL/DM_TF_EXT_UNIONALL_SALES_MAPPING.sql | 2 +- .../DM_TF_EXT_UNIONALL_SALES_MAPPING_NIAD.sql | 89 ++- 6 files changed, 724 insertions(+), 219 deletions(-) diff --git a/EC/03 ec_load_data.ipynb b/EC/03 ec_load_data.ipynb index cfa088d..4e96d96 100644 --- a/EC/03 ec_load_data.ipynb +++ b/EC/03 ec_load_data.ipynb @@ -1829,242 +1829,250 @@ "byteLimit": 2048000, "rowLimit": 10000 }, + "finishTime": 1777652323660, "inputWidgets": {}, "nuid": "f8d0befe-3de4-48a8-ac53-cdc19c897d0f", "showTitle": false, - "submitTime": 1777537485091, + "startTime": 1777652315675, + "submitTime": 1777652314433, "tableResultSettingsMap": {}, "title": "" } }, "outputs": [], "source": [ - "-- ============================================================\n", - "-- 目标表:tmp.tmp_zk_ec_sales_kpi_tmp\n", - "-- 功能:B2C 电商直取数据 → KPI 宽表(QTD 粒度)\n", - "-- 优化:corp_map / brand_base / ta_base 各物化一次,避免重复扫表\n", - "-- ============================================================\n", - "INSERT OVERWRITE TABLE tmp.tmp_zk_ec_sales_kpi_tmp\n", + "-- -- ============================================================\n", + "-- -- 目标表:tmp.tmp_zk_ec_sales_kpi_tmp\n", + "-- -- 功能:B2C 电商直取数据 → KPI 宽表(QTD 粒度)\n", + "-- -- 优化:corp_map / brand_base / ta_base 各物化一次,避免重复扫表\n", + "-- -- ============================================================\n", + "-- INSERT OVERWRITE TABLE tmp.tmp_zk_ec_sales_kpi_tmp\n", "\n", - "WITH\n", + "-- WITH\n", "\n", - "-- ────────────────────────────────────────────────────────────\n", - "-- CTE 1:企业编码映射(原 7 处重复子查询,合并为一次扫描)\n", - "-- 东阳光仅取集团层(ZK_Prod_C IS NULL),其他企业全量\n", - "-- 小表,适合 BROADCAST\n", - "-- ────────────────────────────────────────────────────────────\n", - "corp_map AS (\n", - " SELECT DISTINCT ZK_Corp_C, CORP_COD\n", - " FROM dwd.dwd_inc_gnd_retail_b2c_label_total\n", - " WHERE (ZK_Corp_C = '东阳光' AND ZK_Prod_C IS NULL)\n", - " OR ZK_Corp_C != '东阳光'\n", - "),\n", + "-- -- ────────────────────────────────────────────────────────────\n", + "-- -- CTE 1:企业编码映射(原 7 处重复子查询,合并为一次扫描)\n", + "-- -- 东阳光仅取集团层(ZK_Prod_C IS NULL),其他企业全量\n", + "-- -- 小表,适合 BROADCAST\n", + "-- -- ────────────────────────────────────────────────────────────\n", + "-- corp_map AS (\n", + "-- SELECT DISTINCT ZK_Corp_C, CORP_COD\n", + "-- FROM dwd.dwd_inc_gnd_retail_b2c_label_total\n", + "-- WHERE (ZK_Corp_C = '东阳光' AND ZK_Prod_C IS NULL)\n", + "-- OR ZK_Corp_C != '东阳光'\n", + "-- ),\n", "\n", - "-- ────────────────────────────────────────────────────────────\n", - "-- CTE 2:B2C Top10 品牌驱动数据(当期 + 去年同期一次性关联)\n", - "-- 原 5 个 UNION 分支各自关联一次,现合并为单次自连接\n", - "-- ────────────────────────────────────────────────────────────\n", - "brand_base AS (\n", - " SELECT\n", - " /*+ BROADCAST(m) */\n", - " m.CORP_COD,\n", - " a.ytd,\n", - " a.platform,\n", - " CASE WHEN a.store_type = '三方' THEN '第三方' ELSE a.store_type END AS store_type,\n", - " CASE WHEN UPPER(a.rank) = 'TTL MKT' THEN 'Y' ELSE 'N' END AS total_flag,\n", - " -- 当期指标\n", - " a.yoy_gr,\n", - " a.top1_brand_gr,\n", - " a.top1_brand_val,\n", - " a.growth_driver_brand_val,\n", - " a.growth_driver_brand_gr,\n", - " -- 去年同期指标(ytd + 4 偏移)\n", - " c.yoy_gr AS yoy_gr_ly,\n", - " c.top1_brand_gr AS top1_brand_gr_ly,\n", - " c.growth_driver_brand_gr AS growth_driver_brand_gr_ly\n", - " FROM dwd.dwd_gnd_ec_b2c_top10_drives_brand a\n", - " LEFT JOIN corp_map m\n", - " ON a.corp = m.ZK_Corp_C\n", - " LEFT JOIN dwd.dwd_gnd_ec_b2c_top10_drives_brand c -- 同比:时间偏移 4 期\n", - " ON a.corp = c.corp\n", - " AND a.ytd = c.ytd + 4\n", - " AND a.platform = c.platform\n", - " AND a.store_type = c.store_type\n", - "),\n", + "-- -- ────────────────────────────────────────────────────────────\n", + "-- -- CTE 2:B2C Top10 品牌驱动数据(当期 + 去年同期一次性关联)\n", + "-- -- 原 5 个 UNION 分支各自关联一次,现合并为单次自连接\n", + "-- -- ────────────────────────────────────────────────────────────\n", + "-- brand_base AS (\n", + "-- SELECT\n", + "-- /*+ BROADCAST(m) */\n", + "-- m.CORP_COD,\n", + "-- a.ytd,\n", + "-- a.platform,\n", + "-- CASE WHEN a.store_type = '三方' THEN '第三方' ELSE a.store_type END AS store_type,\n", + "-- CASE WHEN UPPER(a.rank) = 'TTL MKT' THEN 'Y' ELSE 'N' END AS total_flag,\n", + "-- -- 当期指标\n", + "-- a.yoy_gr,\n", + "-- a.top1_brand_gr,\n", + "-- a.top1_brand_val,\n", + "-- a.growth_driver_brand_val,\n", + "-- a.growth_driver_brand_gr,\n", + "-- -- 去年同期指标(ytd + 4 偏移)\n", + "-- c.yoy_gr AS yoy_gr_ly,\n", + "-- c.top1_brand_gr AS top1_brand_gr_ly,\n", + "-- c.growth_driver_brand_gr AS growth_driver_brand_gr_ly\n", + "-- FROM dwd.dwd_gnd_ec_b2c_top10_drives_brand a\n", + "-- LEFT JOIN corp_map m\n", + "-- ON a.corp = m.ZK_Corp_C\n", + "-- LEFT JOIN dwd.dwd_gnd_ec_b2c_top10_drives_brand c -- 同比:时间偏移 4 期\n", + "-- ON a.corp = c.corp\n", + "-- AND a.ytd = c.ytd + 4\n", + "-- AND a.platform = c.platform\n", + "-- AND a.store_type = c.store_type\n", + "-- ),\n", "\n", - "-- ────────────────────────────────────────────────────────────\n", - "-- CTE 3:TA 概览数据(当期 + 去年同期一次性关联)\n", - "-- 原 2 个 UNION 分支各自关联一次,现合并为单次自连接\n", - "-- ────────────────────────────────────────────────────────────\n", - "ta_base AS (\n", - " SELECT\n", - " /*+ BROADCAST(m) */\n", - " m.CORP_COD,\n", - " a.ytd,\n", - " a.platform,\n", - " a.store_type,\n", - " a.ta,\n", - " a.rank,\n", - " CASE WHEN LOWER(a.rank) = 'total' THEN 'Y' ELSE 'N' END AS total_flag,\n", - " REPLACE(a.sales_value, ',', '') AS sales_value, -- 清除千位分隔符\n", - " REPLACE(c.sales_value, ',', '') AS sales_value_ly\n", - " FROM dwd.dwd_gnd_ec_ta_overview a\n", - " LEFT JOIN corp_map m\n", - " ON a.corp_des = m.ZK_Corp_C -- 注意:此处关联键为 corp_des\n", - " LEFT JOIN dwd.dwd_gnd_ec_ta_overview c -- 同比:时间偏移 4 期\n", - " ON a.ytd = c.ytd + 4\n", - " AND a.corp_des = c.corp_des\n", - " AND a.platform = c.platform\n", - " AND a.store_type = c.store_type\n", - " AND a.ta = c.ta\n", - ")\n", + "-- -- ────────────────────────────────────────────────────────────\n", + "-- -- CTE 3:TA 概览数据(当期 + 去年同期一次性关联)\n", + "-- -- 原 2 个 UNION 分支各自关联一次,现合并为单次自连接\n", + "-- -- ────────────────────────────────────────────────────────────\n", + "-- ta_base AS (\n", + "-- SELECT\n", + "-- /*+ BROADCAST(m) */\n", + "-- m.CORP_COD,\n", + "-- a.ytd,\n", + "-- a.platform,\n", + "-- a.store_type,\n", + "-- a.ta,\n", + "-- a.rank,\n", + "-- CASE WHEN LOWER(a.rank) = 'total' THEN 'Y' ELSE 'N' END AS total_flag,\n", + "-- REPLACE(a.sales_value, ',', '') AS sales_value, -- 清除千位分隔符\n", + "-- REPLACE(c.sales_value, ',', '') AS sales_value_ly\n", + "-- FROM dwd.dwd_gnd_ec_ta_overview a\n", + "-- LEFT JOIN corp_map m\n", + "-- ON a.corp_des = m.ZK_Corp_C -- 注意:此处关联键为 corp_des\n", + "-- LEFT JOIN dwd.dwd_gnd_ec_ta_overview c -- 同比:时间偏移 4 期\n", + "-- ON a.ytd = c.ytd + 4\n", + "-- AND a.corp_des = c.corp_des\n", + "-- AND a.platform = c.platform\n", + "-- AND a.store_type = c.store_type\n", + "-- AND a.ta = c.ta\n", + "-- )\n", "\n", - "-- ════════════════════════════════════════════════════════════\n", - "-- KPI 1:市场整体 YOY 增长率(top_yoygr)— 数值型\n", - "-- ════════════════════════════════════════════════════════════\n", - "SELECT\n", - " CORP_COD,\n", - " '' AS ytd,\n", - " ytd AS ytd_src,\n", - " platform,\n", - " store_type,\n", - " 'ROC' AS geo_key,\n", - " 'top_yoygr' AS KPI_name,\n", - " yoy_gr AS Kpi_val,\n", - " yoy_gr_ly AS Kpi_val_ly,\n", - " '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", - " '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", - " total_flag,\n", - " '' AS ta\n", - "FROM brand_base\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- -- KPI 1:市场整体 YOY 增长率(top_yoygr)— 数值型\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- SELECT\n", + "-- CORP_COD,\n", + "-- '' AS ytd,\n", + "-- ytd AS ytd_src,\n", + "-- platform,\n", + "-- store_type,\n", + "-- 'ROC' AS geo_key,\n", + "-- 'top_yoygr' AS KPI_name,\n", + "-- yoy_gr AS Kpi_val,\n", + "-- yoy_gr_ly AS Kpi_val_ly,\n", + "-- '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", + "-- '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", + "-- total_flag,\n", + "-- '' AS ta\n", + "-- FROM brand_base\n", "\n", - "UNION ALL\n", + "-- UNION ALL\n", "\n", - "-- ════════════════════════════════════════════════════════════\n", - "-- KPI 2:Top1 品牌增长率(top1_brand_gr)— 数值型\n", - "-- ════════════════════════════════════════════════════════════\n", - "SELECT\n", - " CORP_COD,\n", - " '' AS ytd,\n", - " ytd AS ytd_src,\n", - " platform,\n", - " store_type,\n", - " 'ROC' AS geo_key,\n", - " 'top1_brand_gr' AS KPI_name,\n", - " top1_brand_gr AS Kpi_val,\n", - " top1_brand_gr_ly AS Kpi_val_ly,\n", - " '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", - " '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", - " total_flag,\n", - " '' AS ta\n", - "FROM brand_base\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- -- KPI 2:Top1 品牌增长率(top1_brand_gr)— 数值型\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- SELECT\n", + "-- CORP_COD,\n", + "-- '' AS ytd,\n", + "-- ytd AS ytd_src,\n", + "-- platform,\n", + "-- store_type,\n", + "-- 'ROC' AS geo_key,\n", + "-- 'top1_brand_gr' AS KPI_name,\n", + "-- top1_brand_gr AS Kpi_val,\n", + "-- top1_brand_gr_ly AS Kpi_val_ly,\n", + "-- '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", + "-- '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", + "-- total_flag,\n", + "-- '' AS ta\n", + "-- FROM brand_base\n", "\n", - "UNION ALL\n", + "-- UNION ALL\n", "\n", - "-- ════════════════════════════════════════════════════════════\n", - "-- KPI 3:Top1 品牌销售额(top1_brand_val)— 字符串型,无同比\n", - "-- ════════════════════════════════════════════════════════════\n", - "SELECT\n", - " CORP_COD,\n", - " '' AS ytd,\n", - " ytd AS ytd_src,\n", - " platform,\n", - " store_type,\n", - " 'ROC' AS geo_key,\n", - " 'top1_brand_val' AS KPI_name,\n", - " '' AS Kpi_val, '' AS Kpi_val_ly,\n", - " top1_brand_val AS str_kpi_val,\n", - " '' AS str_kpi_val_ly,\n", - " '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", - " total_flag,\n", - " '' AS ta\n", - "FROM brand_base\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- -- KPI 3:Top1 品牌销售额(top1_brand_val)— 字符串型,无同比\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- SELECT\n", + "-- CORP_COD,\n", + "-- '' AS ytd,\n", + "-- ytd AS ytd_src,\n", + "-- platform,\n", + "-- store_type,\n", + "-- 'ROC' AS geo_key,\n", + "-- 'top1_brand_val' AS KPI_name,\n", + "-- '' AS Kpi_val, '' AS Kpi_val_ly,\n", + "-- top1_brand_val AS str_kpi_val,\n", + "-- '' AS str_kpi_val_ly,\n", + "-- '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", + "-- total_flag,\n", + "-- '' AS ta\n", + "-- FROM brand_base\n", "\n", - "UNION ALL\n", + "-- UNION ALL\n", "\n", - "-- ════════════════════════════════════════════════════════════\n", - "-- KPI 4:增量贡献品牌销售额(incremental_brand)— 字符串型,无同比\n", - "-- ════════════════════════════════════════════════════════════\n", - "SELECT\n", - " CORP_COD,\n", - " '' AS ytd,\n", - " ytd AS ytd_src,\n", - " platform,\n", - " store_type,\n", - " 'ROC' AS geo_key,\n", - " 'incremental_brand' AS KPI_name,\n", - " '' AS Kpi_val, '' AS Kpi_val_ly,\n", - " growth_driver_brand_val AS str_kpi_val,\n", - " '' AS str_kpi_val_ly,\n", - " '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", - " total_flag,\n", - " '' AS ta\n", - "FROM brand_base\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- -- KPI 4:增量贡献品牌销售额(incremental_brand)— 字符串型,无同比\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- SELECT\n", + "-- CORP_COD,\n", + "-- '' AS ytd,\n", + "-- ytd AS ytd_src,\n", + "-- platform,\n", + "-- store_type,\n", + "-- 'ROC' AS geo_key,\n", + "-- 'incremental_brand' AS KPI_name,\n", + "-- '' AS Kpi_val, '' AS Kpi_val_ly,\n", + "-- growth_driver_brand_val AS str_kpi_val,\n", + "-- '' AS str_kpi_val_ly,\n", + "-- '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", + "-- total_flag,\n", + "-- '' AS ta\n", + "-- FROM brand_base\n", "\n", - "UNION ALL\n", + "-- UNION ALL\n", "\n", - "-- ════════════════════════════════════════════════════════════\n", - "-- KPI 5:增量贡献品牌增长率(incremental_brand_gr)— 数值型\n", - "-- ════════════════════════════════════════════════════════════\n", - "SELECT\n", - " CORP_COD,\n", - " '' AS ytd,\n", - " ytd AS ytd_src,\n", - " platform,\n", - " store_type,\n", - " 'ROC' AS geo_key,\n", - " 'incremental_brand_gr' AS KPI_name,\n", - " growth_driver_brand_gr AS Kpi_val,\n", - " growth_driver_brand_gr_ly AS Kpi_val_ly,\n", - " '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", - " '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", - " total_flag,\n", - " '' AS ta\n", - "FROM brand_base\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- -- KPI 5:增量贡献品牌增长率(incremental_brand_gr)— 数值型\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- SELECT\n", + "-- CORP_COD,\n", + "-- '' AS ytd,\n", + "-- ytd AS ytd_src,\n", + "-- platform,\n", + "-- store_type,\n", + "-- 'ROC' AS geo_key,\n", + "-- 'incremental_brand_gr' AS KPI_name,\n", + "-- growth_driver_brand_gr AS Kpi_val,\n", + "-- growth_driver_brand_gr_ly AS Kpi_val_ly,\n", + "-- '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", + "-- '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", + "-- total_flag,\n", + "-- '' AS ta\n", + "-- FROM brand_base\n", "\n", - "UNION ALL\n", + "-- UNION ALL\n", "\n", - "-- ════════════════════════════════════════════════════════════\n", - "-- KPI 6:企业 TA 销售额(top_corp_sales)— 数值型\n", - "-- 注意:ytd 直接填入 ytd 列,ytd_src 留空(与 brand 系列相反)\n", - "-- ════════════════════════════════════════════════════════════\n", - "SELECT\n", - " CORP_COD,\n", - " ytd AS ytd,\n", - " '' AS ytd_src,\n", - " platform,\n", - " store_type,\n", - " 'ROC' AS geo_key,\n", - " 'top_corp_sales' AS KPI_name,\n", - " sales_value AS Kpi_val,\n", - " sales_value_ly AS Kpi_val_ly,\n", - " '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", - " '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", - " total_flag,\n", - " ta\n", - "FROM ta_base\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- -- KPI 6:企业 TA 销售额(top_corp_sales)— 数值型\n", + "-- -- 注意:ytd 直接填入 ytd 列,ytd_src 留空(与 brand 系列相反)\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- SELECT\n", + "-- CORP_COD,\n", + "-- ytd AS ytd,\n", + "-- '' AS ytd_src,\n", + "-- platform,\n", + "-- store_type,\n", + "-- 'ROC' AS geo_key,\n", + "-- 'top_corp_sales' AS KPI_name,\n", + "-- sales_value AS Kpi_val,\n", + "-- sales_value_ly AS Kpi_val_ly,\n", + "-- '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", + "-- '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", + "-- total_flag,\n", + "-- ta\n", + "-- FROM ta_base \n", + "-- -- left join ta_base c \n", + "-- -- on a.ytd = c.ytd + 100\n", + "-- -- and a.corp_des = c.corp_des \n", + "-- -- and a.platform = c.platform\n", + "-- -- and a.store_type = c.store_type\n", + "-- -- and a.ta = c.ta\n", "\n", - "UNION ALL\n", + "-- UNION ALL\n", "\n", - "-- ════════════════════════════════════════════════════════════\n", - "-- KPI 7:企业 TA 排名(top_rank)— 字符串型,无同比\n", - "-- DISTINCT 去重,避免多条重复排名行\n", - "-- ════════════════════════════════════════════════════════════\n", - "SELECT DISTINCT\n", - " CORP_COD,\n", - " '' AS ytd,\n", - " ytd AS ytd_src,\n", - " platform,\n", - " store_type,\n", - " 'ROC' AS geo_key,\n", - " 'top_rank' AS KPI_name,\n", - " rank AS Kpi_val,\n", - " '' AS Kpi_val_ly,\n", - " '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", - " '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", - " total_flag,\n", - " ta\n", - "FROM ta_base;" + "-- -- ════════════════════════════════════════════════════════════\n", + "-- -- KPI 7:企业 TA 排名(top_rank)— 字符串型,无同比\n", + "-- -- DISTINCT 去重,避免多条重复排名行\n", + "-- -- ════════════════════════════════════════════════════════════\n", + "-- SELECT DISTINCT\n", + "-- CORP_COD,\n", + "-- '' AS ytd,\n", + "-- ytd AS ytd_src,\n", + "-- platform,\n", + "-- store_type,\n", + "-- 'ROC' AS geo_key,\n", + "-- 'top_rank' AS KPI_name,\n", + "-- rank AS Kpi_val,\n", + "-- '' AS Kpi_val_ly,\n", + "-- '' AS str_kpi_val, '' AS str_kpi_val_ly,\n", + "-- '' AS str_kpi_vol, '' AS str_kpi_vol_ly,\n", + "-- total_flag,\n", + "-- ta\n", + "-- FROM ta_base;" ] }, { @@ -2076,10 +2084,204 @@ "byteLimit": 2048000, "rowLimit": 10000 }, + "finishTime": 1777652451150, + "inputWidgets": {}, + "nuid": "9e6100db-d97c-41a6-8b30-4f7a774c1903", + "showTitle": false, + "startTime": 1777652447065, + "submitTime": 1777652446859, + "tableResultSettingsMap": {}, + "title": "" + } + }, + "outputs": [], + "source": [ + "---------------------------------------将直取部分数据处理成KPI形式-----------------------------------------\n", + "insert overwrite table tmp.tmp_zk_ec_sales_kpi_tmp \n", + "select\n", + " b.CORP_COD,\n", + " '' as yyyymm,\n", + " a.ytd ,\n", + " a.platform,\n", + " case when a.store_type = '三方' then '第三方' else a.store_type end store_type ,\n", + " 'ROC' as geo_key,\n", + "'top_yoygr' as KPI_name,\n", + "a.yoy_gr as Kpi_val,\n", + "c.yoy_gr as Kpi_val_ly,\n", + "'' as str_kpi_val,\n", + "'' as str_kpi_val_ly,\n", + "'' as str_kpi_vol,\n", + "'' as str_kpi_vol_ly,\n", + "case when upper(a.rank) = 'TTL MKT' then 'Y' else 'N' end total_flag,\n", + "'' as ta\n", + "from dwd.dwd_gnd_ec_b2c_top10_drives_brand a \n", + "left join (select distinct ZK_Corp_C,CORP_COD from dwd.dwd_inc_gnd_retail_b2c_label_total where (ZK_Corp_C = '东阳光' and ZK_Prod_C is null) or ZK_Corp_C != '东阳光') b \n", + "on a.corp = b.ZK_Corp_C\n", + "left join dwd.dwd_gnd_ec_b2c_top10_drives_brand c \n", + "on a.corp = c.corp \n", + "and a.ytd = c.ytd + 100\n", + "and a.platform = c.platform\n", + "and a.store_type = c.store_type\n", + "-- where upper(a.rank) <> 'TTL MKT' \n", + "union all\n", + "select\n", + " b.CORP_COD,\n", + " '' as yyyymm,\n", + " a.ytd ,\n", + " a.platform,\n", + " case when a.store_type = '三方' then '第三方' else a.store_type end store_type ,\n", + " 'ROC' as geo_key,\n", + "'top1_brand_gr' as KPI_name,\n", + "a.top1_brand_gr as Kpi_val,\n", + "c.top1_brand_gr as Kpi_val_ly,\n", + "'' as str_kpi_val,\n", + "'' as str_kpi_val_ly,\n", + "'' as str_kpi_vol,\n", + "'' as str_kpi_vol_ly,\n", + "case when upper(a.rank) = 'TTL MKT' then 'Y' else 'N' end total_flag,\n", + "'' as ta\n", + "from dwd.dwd_gnd_ec_b2c_top10_drives_brand a \n", + "left join (select distinct ZK_Corp_C,CORP_COD from dwd.dwd_inc_gnd_retail_b2c_label_total where (ZK_Corp_C = '东阳光' and ZK_Prod_C is null) or ZK_Corp_C != '东阳光') b \n", + "on a.corp = b.ZK_Corp_C\n", + "left join dwd.dwd_gnd_ec_b2c_top10_drives_brand c \n", + "on a.corp = c.corp \n", + "and a.ytd = c.ytd + 100\n", + "and a.platform = c.platform\n", + "and a.store_type = c.store_type\n", + "-- where upper(a.rank) <> 'TTL MKT' \n", + "union all\n", + "select\n", + " b.CORP_COD,\n", + " '' as yyyymm,\n", + " a.ytd ,\n", + " a.platform,\n", + " case when a.store_type = '三方' then '第三方' else a.store_type end store_type,\n", + " 'ROC' as geo_key,\n", + "'top1_brand_val' as KPI_name,\n", + "'' as Kpi_val,\n", + "'' as Kpi_val_ly,\n", + "a.top1_brand_val as str_kpi_val,\n", + "'' as str_kpi_val_ly,\n", + "'' as str_kpi_vol,\n", + "'' as str_kpi_vol_ly,\n", + "case when upper(a.rank) = 'TTL MKT' then 'Y' else 'N' end total_flag,\n", + "'' as ta\n", + "from dwd.dwd_gnd_ec_b2c_top10_drives_brand a \n", + "left join (select distinct ZK_Corp_C,CORP_COD from dwd.dwd_inc_gnd_retail_b2c_label_total where (ZK_Corp_C = '东阳光' and ZK_Prod_C is null) or ZK_Corp_C != '东阳光') b \n", + "on a.corp = b.ZK_Corp_C\n", + "-- where upper(a.rank) <> 'TTL MKT' \n", + "union all \n", + "select \n", + " b.CORP_COD,\n", + " '' as yyyymm,\n", + " a.ytd ,\n", + " a.platform,\n", + " case when a.store_type = '三方' then '第三方' else a.store_type end store_type,\n", + " 'ROC' as geo_key,\n", + " 'incremental_brand' as KPI_name,\n", + " '' as Kpi_val,\n", + " '' as Kpi_val_ly,\n", + " a.growth_driver_brand_val as str_kpi_val,\n", + " '' as str_kpi_val_ly,\n", + " '' as str_kpi_vol,\n", + " '' as str_kpi_vol_ly,\n", + " case when upper(a.rank) = 'TTL MKT' then 'Y' else 'N' end total_flag,\n", + " '' as ta\n", + "from dwd.dwd_gnd_ec_b2c_top10_drives_brand a \n", + "left join (select distinct ZK_Corp_C,CORP_COD from dwd.dwd_inc_gnd_retail_b2c_label_total where (ZK_Corp_C = '东阳光' and ZK_Prod_C is null) or ZK_Corp_C != '东阳光') b \n", + "on a.corp = b.ZK_Corp_C\n", + "-- where upper(a.rank) <> 'TTL MKT' \n", + "union all\n", + "select \n", + " b.CORP_COD,\n", + " '' as yyyymm,\n", + " a.ytd ,\n", + " a.platform,\n", + " case when a.store_type = '三方' then '第三方' else a.store_type end store_type,\n", + " 'ROC' as geo_key,\n", + " 'incremental_brand_gr' as KPI_name,\n", + " a.growth_driver_brand_gr as Kpi_val,\n", + " c.growth_driver_brand_gr as Kpi_val_ly,\n", + " '' as str_kpi_val,\n", + " '' as str_kpi_val_ly,\n", + " '' as str_kpi_vol,\n", + " '' as str_kpi_vol_ly,\n", + " case when upper(a.rank) = 'TTL MKT' then 'Y' else 'N' end total_flag,\n", + " '' as ta\n", + "from dwd.dwd_gnd_ec_b2c_top10_drives_brand a \n", + "left join (select distinct ZK_Corp_C,CORP_COD from dwd.dwd_inc_gnd_retail_b2c_label_total where (ZK_Corp_C = '东阳光' and ZK_Prod_C is null) or ZK_Corp_C != '东阳光') b \n", + "on a.corp = b.ZK_Corp_C\n", + "left join dwd.dwd_gnd_ec_b2c_top10_drives_brand c \n", + "on a.corp = c.corp \n", + "and a.ytd = c.ytd + 100\n", + "and a.platform = c.platform\n", + "and a.store_type = c.store_type\n", + "-- where upper(a.rank) <> 'TTL MKT' \n", + "union all \n", + "select\n", + " b.CORP_COD,\n", + " a.ytd yyyymm,\n", + " '' as ytd,\n", + " a.platform,\n", + " a.store_type,\n", + " 'ROC' as geo_key,\n", + " 'top_corp_sales' as KPI_name,\n", + " replace(a.sales_value,',','' ) as Kpi_val,\n", + " replace(c.sales_value,',','' ) as Kpi_val_ly,\n", + " '' as str_kpi_val,\n", + " '' as str_kpi_val_ly,\n", + " '' as str_kpi_vol,\n", + " '' as str_kpi_vol_ly,\n", + " case when lower(a.rank) = 'total' then 'Y' else 'N' end total_flag,\n", + " a.ta\n", + "from dwd.dwd_gnd_ec_ta_overview a \n", + "left join (select distinct ZK_Corp_C,CORP_COD from dwd.dwd_inc_gnd_retail_b2c_label_total where (ZK_Corp_C = '东阳光' and ZK_Prod_C is null) or ZK_Corp_C != '东阳光') b \n", + "on a.corp_des = b.ZK_Corp_C\n", + "left join dwd.dwd_gnd_ec_ta_overview c \n", + "on a.ytd = c.ytd + 100\n", + "and a.corp_des = c.corp_des \n", + "and a.platform = c.platform\n", + "and a.store_type = c.store_type\n", + "and a.ta = c.ta\n", + "-- where lower(a.rank) <> 'total'\n", + "union all \n", + "select distinct\n", + " b.CORP_COD,\n", + " '' yyyymm,\n", + " a.ytd as ytd,\n", + " a.platform,\n", + " a.store_type,\n", + " 'ROC' as geo_key,\n", + " 'top_rank' as KPI_name,\n", + " a.rank as Kpi_val,\n", + " '' as Kpi_val_ly,\n", + " '' as str_kpi_val,\n", + " '' as str_kpi_val_ly,\n", + " '' as str_kpi_vol,\n", + " '' as str_kpi_vol_ly,\n", + " case when lower(a.rank) = 'total' then 'Y' else 'N' end total_flag,\n", + " a.ta\n", + "from dwd.dwd_gnd_ec_ta_overview a \n", + "left join (select distinct ZK_Corp_C,CORP_COD from dwd.dwd_inc_gnd_retail_b2c_label_total where (ZK_Corp_C = '东阳光' and ZK_Prod_C is null) or ZK_Corp_C != '东阳光') b \n", + "on a.corp_des = b.ZK_Corp_C\n", + "-- where lower(a.rank) <> 'total'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "application/vnd.databricks.v1+cell": { + "cellMetadata": { + "byteLimit": 2048000, + "rowLimit": 10000 + }, + "finishTime": 1777652456889, "inputWidgets": {}, "nuid": "0c0fe2ec-f80e-4872-85bf-fd5d058cc8b8", "showTitle": false, - "submitTime": 1777537485097, + "startTime": 1777652453844, + "submitTime": 1777652453744, "tableResultSettingsMap": {}, "title": "" } diff --git a/Retail/13 DM_TF_EXT_RETAIL_SALES.sql b/Retail/13 DM_TF_EXT_RETAIL_SALES.sql index f387796..2ba1500 100644 --- a/Retail/13 DM_TF_EXT_RETAIL_SALES.sql +++ b/Retail/13 DM_TF_EXT_RETAIL_SALES.sql @@ -38,6 +38,42 @@ -- COMMAND ---------- +-- CREATE TABLE catalog_e2_ngbi_qas.DM.DM_TF_EXT_RETAIL_NIAD_SALES ( +-- YYYYMM STRING, +-- PACK_CODE STRING, +-- CORP_CODE STRING, +-- AUDIT_CODE STRING, +-- PLATFORM_TYPE STRING, +-- STORE_NAME STRING, +-- STORE_TYPE STRING, +-- REGION_TYPE STRING, +-- PACK_FLAG STRING, +-- PROD_FLAG STRING, +-- DTP_FLAG STRING, +-- SALES_UNIT_CAL DECIMAL(38,10), +-- SALES_UNIT_CAL_LY STRING, +-- SALES_VALUE_CAL DECIMAL(38,10), +-- SALES_VALUE_CAL_LY STRING, +-- CONUTING_UNIT DECIMAL(38,10), +-- CONUTING_UNIT_LY STRING, +-- DATA_SOURCE STRING, +-- INST_CODE STRING, +-- CMPS_FLAG STRING, +-- DEPT_NAME STRING, +-- PRESCRIPTION STRING, +-- PRESCRIPTION_LY STRING, +-- NEW_CODE STRING, +-- AREA STRING, +-- H_LEVEL STRING, +-- REIMBURSE STRING, +-- REIMBURSE_TYPE STRING, +-- PRESCRIPTION_SOURCE STRING, +-- ETL_INSERT_DT TIMESTAMP, +-- ETL_UPDATE_DT TIMESTAMP) +-- USING delta + +-- COMMAND ---------- + CREATE OR REPLACE TEMPORARY VIEW RETAIL_SALES AS SELECT @@ -168,3 +204,48 @@ SELECT FROM RETAIL_SALES ; + +-- COMMAND ---------- + +-- **************************************************** +-- 创建日期:2026-04-30 +-- 功能: 月份NIAD不进行季度汇总, 新建DM.DM_TF_EXT_RETAIL_NIAD_SALES表做关联 +-- **************************************************** +-- INSERT OVERWRITE TABLE DM.DM_TF_EXT_RETAIL_NIAD_SALES +SELECT + cur.month AS YYYYMM, + cur.pack_code AS PACK_CODE, + '' AS CORP_CODE, + cur.zk_regin AS AUDIT_CODE, + '' AS PLATFORM_TYPE, + '' AS STORE_NAME, + '' AS STORE_TYPE, + '' AS REGION_TYPE, + '' AS PACK_FLAG, + '' AS PROD_FLAG, + '' AS DTP_FLAG, + CAST(REPLACE(cur.sales_unit, ',', '') AS DECIMAL(38, 10)) AS SALES_UNIT_CAL, + IFNULL(CAST(REPLACE(ly.sales_unit, ',', '') AS DECIMAL(38, 10)), 0) AS SALES_UNIT_CAL_LY, + CAST(REPLACE(cur.sales_value, ',', '') AS DECIMAL(38, 10)) AS SALES_VALUE_CAL, + IFNULL(CAST(REPLACE(ly.sales_value, ',', '') AS DECIMAL(38, 10)), 0) AS SALES_VALUE_CAL_LY, + CAST(cur.counting_unit AS DECIMAL(38, 10)) AS CONUTING_UNIT, + IFNULL(CAST(ly.counting_unit AS DECIMAL(38, 10)), 0) AS CONUTING_UNIT_LY, + 'Retail(Quarterly)' AS DATA_SOURCE, + '' AS INST_CODE, + '' AS CMPS_FLAG, + '' AS DEPT_NAME, + '' AS PRESCRIPTION, + '' AS PRESCRIPTION_LY, + '' AS NEW_CODE, + '' AS AREA, + '' AS H_LEVEL, + '' AS REIMBURSE, + '' AS REIMBURSE_TYPE, + '' AS PRESCRIPTION_SOURCE, + FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP(), 'UTC+8') AS ETL_INSERT_DT, + FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP(), 'UTC+8') AS ETL_UPDATE_DT +FROM (select * from tmp.tmp_retail_pack_rawdata where level_market = 'NIAD') cur +LEFT JOIN (select * from tmp.tmp_retail_pack_rawdata where level_market = 'NIAD') ly + ON CAST(CAST(ly.month AS INT) + 100 AS STRING) = cur.month + AND ly.pack_code = cur.pack_code + AND ly.zk_regin = cur.zk_regin diff --git a/UNIONALL/DM_TF_EXT_UNIONALL_MARKET_SALES.sql b/UNIONALL/DM_TF_EXT_UNIONALL_MARKET_SALES.sql index 43b2e3d..ac837d5 100644 --- a/UNIONALL/DM_TF_EXT_UNIONALL_MARKET_SALES.sql +++ b/UNIONALL/DM_TF_EXT_UNIONALL_MARKET_SALES.sql @@ -521,4 +521,147 @@ SELECT FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP(), 'UTC+8') AS ETL_INSERT_DT, FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP(), 'UTC+8') AS ETL_UPDATE_DT FROM - joined; \ No newline at end of file + joined; + +-- COMMAND ---------- + +INSERT into TABLE + DM.DM_TF_EXT_UNIONALL_MARKET_SALES +WITH + t1_filtered AS ( + SELECT + * + FROM + DM.DM_TF_EXT_RETAIL_NIAD_SALES + ), + mapping_cleaned AS ( + SELECT + * + FROM + ( + SELECT + PACK_CODE, + DATASOURCE, + MARKET, + KEY_COMPETITOR, + CLASS, + MARKET_RATIO, + Value_brand_Ratio, + Unit_brand_Ratio, + CountingUnit_brand_Ratio, + PDOT_brand_Ratio, + GREATEST ( + starttime, + Value_brand_Ratio_start, + Unit_brand_start, + CountingUnit_brand_start, + PDOT_brand_start + ) AS eff_start, + LEAST ( + endtime, + Value_brand_Ratio_end, + Unit_brand_end, + CountingUnit_brand_end, + PDOT_brand_end + ) AS eff_end + FROM + DM.dm_td_ext_unionall_market_pack_mapping + ) tmp + WHERE + eff_start <= eff_end -- 在外层子查询中过滤 + ) , + joined AS ( + SELECT + /*+ BROADCAST(t2, t3) */ + t1.*, + -- 当年 ratio + t2.MARKET, + t2.KEY_COMPETITOR, + t2.CLASS, + t2.MARKET_RATIO AS cy_market_ratio, + t2.Value_brand_Ratio AS cy_value_ratio, + t2.Unit_brand_Ratio AS cy_unit_ratio, + t2.CountingUnit_brand_Ratio AS cy_cu_ratio, + t2.PDOT_brand_Ratio AS cy_pdot_ratio, + -- 去年 ratio + t3.MARKET_RATIO AS ly_market_ratio, + t3.Value_brand_Ratio AS ly_value_ratio, + t3.Unit_brand_Ratio AS ly_unit_ratio, + t3.CountingUnit_brand_Ratio AS ly_cu_ratio, + t3.PDOT_brand_Ratio AS ly_pdot_ratio + FROM + t1_filtered t1 + LEFT JOIN mapping_cleaned t2 ON t1.PACK_CODE = t2.PACK_CODE + AND t1.DATA_SOURCE = t2.DATASOURCE + AND t1.YYYYMM >= t2.eff_start + AND t1.YYYYMM <= t2.eff_end + LEFT JOIN mapping_cleaned t3 ON t1.PACK_CODE = t3.PACK_CODE + AND t1.DATA_SOURCE = t3.DATASOURCE + AND (t1.YYYYMM - 100) >= t3.eff_start + AND (t1.YYYYMM - 100) <= t3.eff_end + AND t2.MARKET = t3.MARKET -- 保持原逻辑 + ) +SELECT + NVL(MARKET, 'ALL Market') AS MARKET, + NVL(KEY_COMPETITOR, 'OTHERS') AS KEY_COMPETITOR, + CASE + WHEN trim(lower(CLASS)) = 'others' THEN 'OTHERS' + WHEN CLASS IS NULL THEN 'OTHERS' + ELSE CLASS + END AS CLASS, + YYYYMM, + PACK_CODE, + CORP_CODE, + AUDIT_CODE, + PLATFORM_TYPE, + STORE_NAME, + STORE_TYPE, + REGION_TYPE, + DATA_SOURCE, + PACK_FLAG, + PROD_FLAG, + DTP_FLAG, + CMPS_FLAG, + NEW_CODE, + INST_CODE, + NULL AS AIA_HP_FLAG, + DEPT_NAME, + H_LEVEL, + REIMBURSE, + REIMBURSE_TYPE, + PRESCRIPTION_SOURCE AS PRESCRIPTION_TYPE, + PRESCRIPTION, + PRESCRIPTION_LY, + -- 预计算公用因子,避免重复计算 + NVL(NVL(cy_market_ratio, 1) * cy_value_ratio, 1) AS VA, + NVL(NVL(cy_market_ratio, 1) * cy_unit_ratio, 1) AS UT, + NVL(NVL(cy_market_ratio, 1) * cy_cu_ratio, 1) AS CU, + NVL(NVL(cy_market_ratio, 1) * cy_pdot_ratio, 1) AS PT, + CAST( + SALES_UNIT_CAL * NVL(cy_unit_ratio, 1) * NVL(cy_market_ratio, 1) AS DECIMAL(35, 6) + ) AS SALES_UNIT_CAL, + CAST( + SALES_UNIT_CAL_LY * NVL(ly_unit_ratio, 1) * NVL(ly_market_ratio, 1) AS DECIMAL(35, 6) + ) AS SALES_UNIT_CAL_LY, + CAST( + SALES_VALUE_CAL * NVL(cy_value_ratio, 1) * NVL(cy_market_ratio, 1) AS DECIMAL(35, 6) + ) AS SALES_VALUE_CAL, + CAST( + SALES_VALUE_CAL_LY * NVL(ly_value_ratio, 1) * NVL(ly_market_ratio, 1) AS DECIMAL(35, 6) + ) AS SALES_VALUE_CAL_LY, + CAST( + CONUTING_UNIT * NVL(cy_cu_ratio, 1) * NVL(cy_market_ratio, 1) AS DECIMAL(35, 6) + ) AS CONUTING_UNIT, + CAST( + CONUTING_UNIT_LY * NVL(ly_cu_ratio, 1) * NVL(ly_market_ratio, 1) AS DECIMAL(35, 6) + ) AS CONUTING_UNIT_LY, + CAST( + CONUTING_UNIT * NVL(cy_pdot_ratio, 1) * NVL(cy_market_ratio, 1) AS DECIMAL(35, 6) + ) AS PDOT, + CAST( + CONUTING_UNIT_LY * NVL(ly_pdot_ratio, 1) * NVL(ly_market_ratio, 1) AS DECIMAL(35, 6) + ) AS PDOT_LY, + FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP(), 'UTC+8') AS ETL_INSERT_DT, + FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP(), 'UTC+8') AS ETL_UPDATE_DT +FROM + joined; diff --git a/UNIONALL/DM_TF_EXT_UNIONALL_SALES.sql b/UNIONALL/DM_TF_EXT_UNIONALL_SALES.sql index 7e02e1e..d8a0317 100644 --- a/UNIONALL/DM_TF_EXT_UNIONALL_SALES.sql +++ b/UNIONALL/DM_TF_EXT_UNIONALL_SALES.sql @@ -346,4 +346,4 @@ SELECT FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP(),'UTC+8') AS ETL_INSERT_DT, FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP(),'UTC+8') AS ETL_UPDATE_DT FROM DM.DM_TF_EXT_XIEHE_SALES -; \ No newline at end of file +; diff --git a/UNIONALL/DM_TF_EXT_UNIONALL_SALES_MAPPING.sql b/UNIONALL/DM_TF_EXT_UNIONALL_SALES_MAPPING.sql index 4dbf281..ef751a4 100644 --- a/UNIONALL/DM_TF_EXT_UNIONALL_SALES_MAPPING.sql +++ b/UNIONALL/DM_TF_EXT_UNIONALL_SALES_MAPPING.sql @@ -473,7 +473,7 @@ SELECT END AS CONUTING_UNIT, CASE WHEN A.CONUTING_UNIT_LY = 0 THEN NULL - https://adb-1064580724995799.3.databricks.azure.cn/editor/notebooks/3456519074298505?o=1064580724995799$0ELSE CAST(A.CONUTING_UNIT_LY AS DECIMAL(35, 10)) + ELSE CAST(A.CONUTING_UNIT_LY AS DECIMAL(35, 10)) END AS CONUTING_UNIT_LY, CASE WHEN A.PDOT = 0 THEN NULL diff --git a/UNIONALL/DM_TF_EXT_UNIONALL_SALES_MAPPING_NIAD.sql b/UNIONALL/DM_TF_EXT_UNIONALL_SALES_MAPPING_NIAD.sql index c9b8103..ea9a913 100644 --- a/UNIONALL/DM_TF_EXT_UNIONALL_SALES_MAPPING_NIAD.sql +++ b/UNIONALL/DM_TF_EXT_UNIONALL_SALES_MAPPING_NIAD.sql @@ -41,7 +41,7 @@ -- DBTITLE 1,NIAD单独页面 -- **************************************************** -- 功能说明:提取NIAD(非胰岛素类抗糖尿病药物)市场的销售数据并创建映射表 --- 数据源:EC(Monthly)月度电商数据 + Retail(Quarterly)季度零售数据 +-- 数据源:EC(Monthly)月度电商数据 -- 创建日期:2026-04-02 -- 修改日期:2026-04-02 -- **************************************************** @@ -51,11 +51,91 @@ WITH -- CTE 1:获取NIAD市场的产品编码集合 -- 注:直接下推双重过滤条件,减少扫描数据量 +-- 20260430拆分 niad_pack_cods AS ( SELECT DISTINCT PACK_COD FROM DM.DM_TF_EXT_UNIONALL_MARKET_SALES WHERE MARKET = 'NIAD (Non-Insulin Anti-Diabetic) Market' - AND DATA_SOURCE IN ('EC(Monthly)', 'Retail(Quarterly)') + AND DATA_SOURCE ='EC(Monthly)' +) + +-- 主查询:提取所有关联市场的完整销售数据 +-- BROADCAST 小表 niad_markets,避免大表 shuffle +SELECT + -- 业务维度 + t.MARKET, + t.KEY_COMPETITOR, + t.CLASS, + t.YYYYMM, + + -- 产品标识 + t.PACK_COD, + t.AUDIT_COD, + + -- 数据来源 + t.DATA_SOURCE, + + -- 调整系数 + t.VA, -- Value Adjustment + t.UT, -- Unit Adjustment + t.CU, -- Counting Unit Adjustment + t.PT, -- PDOT Adjustment + + -- 当期销售指标 + t.SALES_UNIT_CAL, + t.SALES_VALUE_CAL, + t.CONUTING_UNIT, -- 注:字段名原始拼写保持不变 + t.PDOT, + + -- 去年同期指标 + t.SALES_UNIT_CAL_LY, + t.SALES_VALUE_CAL_LY, + t.CONUTING_UNIT_LY, + t.PDOT_LY, + + -- 处方指标 + t.PRESCRIPTION, + t.PRESCRIPTION_LY, + + -- 衍生组合键 + CONCAT(t.PACK_COD, t.DATA_SOURCE) AS PACK_SOURCE, + CONCAT(t.AUDIT_COD, t.DATA_SOURCE) AS AUDIT_SOURCE, + CONCAT(t.MARKET, t.DATA_SOURCE) AS MARKET_SOURCE, + CONCAT(t.MARKET,t.CLASS, t.DATA_SOURCE) AS CLASS_SOURCE, + + -- 时间维度:优化为 TO_DATE 直接解析 yyyyMM 格式,避免字符串拼接 + TO_DATE(t.YYYYMM, 'yyyyMM') AS DATE_KEY, + PLATFORM_TYPE, + STORE_NAME, + STORE_TYPE, + + -- 零售铺货率(仅 Retail 行有值,EC 行为 NULL) + NULL AS DIGITAL_SPREAD_RATE, + NULL AS WEIGHTED_SPREAD_RATE + +FROM DM.DM_TF_EXT_UNIONALL_MARKET_SALES t +LEFT SEMI JOIN niad_pack_cods m ON t.PACK_COD = m.PACK_COD +WHERE t.DATA_SOURCE IN ('EC(Monthly)') + +-- COMMAND ---------- + +-- **************************************************** +-- 功能说明:提取NIAD(非胰岛素类抗糖尿病药物)市场的销售数据并创建映射表 +-- 数据源:Retail(Quarterly)季度零售数据 +-- 创建日期:2026-04-02 +-- 修改日期:2026-04-02 +-- **************************************************** +INSERT into DM.DM_TF_EXT_UNIONALL_SALES_MAPPING_NIAD + +WITH + +-- CTE 1:获取NIAD市场的产品编码集合 +-- 注:直接下推双重过滤条件,减少扫描数据量 +niad_pack_cods AS ( + SELECT DISTINCT PACK_COD + FROM DM.DM_TF_EXT_UNIONALL_MARKET_SALES + WHERE MARKET = 'NIAD (Non-Insulin Anti-Diabetic) Market' + AND DATA_SOURCE IN ('Retail(Quarterly)') ), -- CTE 2:从KPI宽转长表中横向取出三个零售铺货率/价格指标 @@ -66,11 +146,10 @@ kpi_pivot AS ( pack_code, YYYYMM, geo_key, - MAX(CASE WHEN KPI_name = 'pack_price' THEN kpi_val END) AS PRICE, MAX(CASE WHEN KPI_name = 'digital_spread_rate' THEN kpi_val END) AS DIGITAL_SPREAD_RATE, MAX(CASE WHEN KPI_name = 'weighted_spread_rate' THEN kpi_val END) AS WEIGHTED_SPREAD_RATE FROM dm.dm_zk_retail_sales_kpi - WHERE KPI_name IN ('pack_price', 'digital_spread_rate', 'weighted_spread_rate') + WHERE KPI_name IN ( 'digital_spread_rate', 'weighted_spread_rate') AND ta = 'DM' GROUP BY pack_code, YYYYMM, geo_key ) @@ -137,4 +216,4 @@ LEFT JOIN kpi_pivot kpi AND kpi.YYYYMM = t.YYYYMM AND kpi.geo_key = t.AUDIT_COD AND t.DATA_SOURCE = 'Retail(Quarterly)' -WHERE t.DATA_SOURCE IN ('EC(Monthly)', 'Retail(Quarterly)') +WHERE t.DATA_SOURCE IN ('Retail(Quarterly)')