Files
MarketAnalysis-ETL/EC/03 ec_load_data.ipynb

2512 lines
96 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778478974793,
"inputWidgets": {},
"nuid": "86f0c1e4-9672-4b69-b7d7-e972573aa69d",
"showTitle": false,
"startTime": 1778478973655,
"submitTime": 1778478972034,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-- 有几张表发生了变化\n",
"-- tmp.tmp_ec_temp_market\n",
"-- tmp.tmp_ec_temp_market_del \n",
"-- dws.dws_zk_ec_pack_property\n",
"\n",
"-- dm.dm_zk_ec_market_ratio"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778478975285,
"inputWidgets": {},
"nuid": "f319d145-a050-425c-b86f-c73d2e6f41ad",
"showTitle": false,
"startTime": 1778478974798,
"submitTime": 1778478972040,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"CREATE OR REPLACE TEMPORARY VIEW EC_TBLMARKET_BYMONTH AS\n",
"SELECT DISTINCT\n",
" market_no,\n",
" market,\n",
" bu,\n",
" atc1_code,\n",
" atc2_code,\n",
" atc3_code,\n",
" atc4_code,\n",
" nfc1_code,\n",
" nfc2_code,\n",
" nfc3_code,\n",
" pack_code,\n",
" pack_desc,\n",
" strength,\n",
" product_code,\n",
" product_desc,\n",
" molecule_code,\n",
" molecule_desc,\n",
" not_in_flag,\n",
" extend_market,\n",
" extend_market_ratio,\n",
" corporation_code,\n",
" corporation_desc,\n",
" manufacturer_code,\n",
" manufacturer_desc\n",
"FROM\n",
" DWD.dwd_gnd_ec_tblmarket_bymonth"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778478991545,
"inputWidgets": {},
"nuid": "a11838c0-855f-4fe6-95d7-790959cb6739",
"showTitle": false,
"startTime": 1778478975290,
"submitTime": 1778478972044,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"insert overwrite table tmp.tmp_ec_temp_market \n",
"-- ============================================================\n",
"-- 药品包装属性维度宽表\n",
"-- 来源IQVIA 零售包装属性 + NRDL 补充属性 + 市场归属规则\n",
"-- 核心逻辑基于多维度模糊匹配将包装映射到市场Market/BU\n",
"-- 过滤条件:仅保留能匹配到市场的记录\n",
"-- ============================================================\n",
"SELECT DISTINCT\n",
"\n",
" -- ────────────── 基础标识码(统一格式化补零)──────────────\n",
" b.iqvia_lineno,\n",
"\n",
" -- IQVIA 包装编码:纯数字补足 12 位,非数字直接保留\n",
" IF(\n",
" NVL(b.iqvia_pack_code, 0) REGEXP '^[0-9]',\n",
" RIGHT(CONCAT('000000000000', NVL(b.iqvia_pack_code, 0)), 12),\n",
" NVL(b.iqvia_pack_code, 0)\n",
" ) AS iqvia_pack_code,\n",
"\n",
" -- IQVIA 产品编码:补足 9 位\n",
" RIGHT(CONCAT('000000000', NVL(b.iqvia_prod_code, 0)), 9) AS prod_cod,\n",
"\n",
" -- ────────────── 基础属性标记 ──────────────\n",
" b.iqvia_notes,\n",
" b.new_pack_flag, -- 新包装标记\n",
" b.is_exists_chpa, -- 是否存在 CHPA 数据\n",
"\n",
" -- 中康产品 ID补足 7 位\n",
" RIGHT(CONCAT('0000000', NVL(b.product_id, 0)), 7) AS product_id,\n",
"\n",
" -- ────────────── 药品属性 ──────────────\n",
" b.prescription_nature, -- 处方性质Rx/OTC\n",
" b.medicine_type, -- 药品类型\n",
" b.zk_medicine_tier1, -- 中康分类层级 1~4\n",
" b.zk_medicine_tier2,\n",
" b.zk_medicine_tier3,\n",
" b.zk_medicine_tier4,\n",
" b.common_name, -- 通用名\n",
" b.dosage_form, -- 剂型\n",
" b.user_type,\n",
" b.category_name,\n",
" b.product_name,\n",
" b.brand_name, -- 品牌名\n",
"\n",
" -- ────────────── 厂商及规格 ──────────────\n",
" b.zk_manu_des, -- 生产企业(中康)\n",
" b.zk_corp_des, -- 集团企业(中康)\n",
" b.zk_pack_des, -- 包装规格(中康)\n",
" b.counting_unit_a,\n",
" b.dosage_unit_a,\n",
" b.unit_a,\n",
"\n",
" -- ────────────── NFC 分类APP 层级:治疗大类/亚类/品类)──────────────\n",
" b.app1_cod, b.app1_des, b.app1_des_c,\n",
" b.app2_cod, b.app2_des, b.app2_des_c,\n",
" b.app3_cod, b.app3_des, b.app3_des_c,\n",
"\n",
" -- ────────────── ATC 分类WHO 解剖治疗化学分类 1~4 级)──────────────\n",
" b.atc1_cod, b.atc1_des, b.atc1_des_c,\n",
" b.atc2_cod, b.atc2_des, b.atc2_des_c,\n",
" b.atc3_cod, b.atc3_des, b.atc3_des_c,\n",
" b.atc4_cod, b.atc4_des, b.atc4_des_c,\n",
"\n",
" -- ────────────── 药品政策属性 ──────────────\n",
" b.bio_desc, -- 生物药标记\n",
" RIGHT(CONCAT('000000', NVL(b.cmps_cod, 0)), 6) AS cmps_cod, -- 化合物编码:补足 6 位\n",
" b.cmps_des, b.cmps_des_c,\n",
" b.corp_cod, b.corp_des, b.corp_des_c, -- 集团编码\n",
" b.edl_desc, -- 基本药物目录标记\n",
" b.eth_otc_desc, -- 处方/非处方标记\n",
" b.gene_orig_desc, -- 原研/仿制标记\n",
" b.gqce_desc, -- 一致性评价标记\n",
" b.manu_cod, b.manu_des, b.manu_des_c, -- 生产企业编码\n",
" b.mnfl_cod, b.mnfl_des,\n",
" b.nrdl_desc, -- 国家医保目录标记\n",
" b.pack_des,\n",
" b.stgh_des, -- 规格/含量描述\n",
" b.pack_lch,\n",
" b.paed_desc, -- 儿科用药标记\n",
" b.prod_des, b.prod_des_c,\n",
" b.tcm_desc, -- 中药标记\n",
" b.vbp_desc, -- 集采中选标记\n",
" b.unit,\n",
" b.counting_unit,\n",
" b.dosage_unit,\n",
"\n",
" -- ────────────── 补充维度(来自关联表)──────────────\n",
" NVL(mole.NRDL_Entry_Date, '') AS NRDL_ENTRY_DATE, -- 进入医保目录日期\n",
" tblmkt.Market, -- 市场名称\n",
" tblmkt.bu, -- BU 归属\n",
" NVL(tblmkt.extend_market_ratio, 1) AS extend_market_ratio, -- 扩展市场系数(默认 1\n",
"\n",
" -- AZ 品牌标记:判断集团企业是否为阿斯利康\n",
" IF(b.corp_des_c IN ('阿斯利康制药集团'), 'Y', 'N') AS is_az\n",
"\n",
"FROM dwd.dwd_gnd_ext_retail_pack_property AS b\n",
"\n",
"-- ────────────── JOIN 1关联 NRDL 辅助属性(左连接,按包装编码)──────────────\n",
"LEFT JOIN dwd.dwd_ims_td_pack_additional_attribute mole\n",
" ON b.iqvia_pack_code = mole.Pack_Code\n",
"\n",
"-- ────────────── JOIN 2关联市场归属规则表多维度模糊匹配──────────────\n",
"-- 规则:规则表中为 NULL 的维度视为\"通配符\",允许任意值匹配(即不做限制)\n",
"-- 过滤仅使用非扩展市场extend_market IS NULL且有效规则NOT_IN_FLAG 为空或为 '1'\n",
"LEFT JOIN (\n",
" SELECT\n",
" market, bu,\n",
" atc1_code, atc2_code, atc3_code, atc4_code,\n",
" nfc1_code, nfc2_code, nfc3_code,\n",
" pack_code, pack_desc, strength,\n",
" product_code, product_desc,\n",
" molecule_code, molecule_desc,\n",
" not_in_flag, extend_market, extend_market_ratio,\n",
" corporation_code, corporation_desc,\n",
" manufacturer_code, manufacturer_desc\n",
" FROM EC_TBLMARKET_BYMONTH\n",
" WHERE extend_market IS NULL\n",
" AND (NOT_IN_FLAG IS NULL OR NOT_IN_FLAG = '1')\n",
") tblmkt\n",
"ON\n",
" -- ATC 四级分类匹配(规则为 NULL 则通配)\n",
" COALESCE(b.ATC1_COD, '') = CASE WHEN tblmkt.ATC1_Code IS NULL THEN COALESCE(b.ATC1_COD, '') ELSE tblmkt.ATC1_Code END\n",
" AND COALESCE(b.ATC2_COD, '') = CASE WHEN tblmkt.ATC2_Code IS NULL THEN COALESCE(b.ATC2_COD, '') ELSE tblmkt.ATC2_Code END\n",
" AND COALESCE(b.ATC3_COD, '') = CASE WHEN tblmkt.ATC3_Code IS NULL THEN COALESCE(b.ATC3_COD, '') ELSE tblmkt.ATC3_Code END\n",
" AND COALESCE(b.ATC4_COD, '') = CASE WHEN tblmkt.ATC4_Code IS NULL THEN COALESCE(b.ATC4_COD, '') ELSE tblmkt.ATC4_Code END\n",
"\n",
" -- NFC 三级分类匹配\n",
" AND COALESCE(b.APP1_COD, '') = CASE WHEN tblmkt.NFC1_Code IS NULL THEN COALESCE(b.APP1_COD, '') ELSE tblmkt.NFC1_Code END\n",
" AND COALESCE(b.APP2_COD, '') = CASE WHEN tblmkt.NFC2_Code IS NULL THEN COALESCE(b.APP2_COD, '') ELSE tblmkt.NFC2_Code END\n",
" AND COALESCE(b.app3_cod, '') = CASE WHEN tblmkt.NFC3_Code IS NULL THEN COALESCE(b.app3_cod, '') ELSE tblmkt.NFC3_Code END\n",
"\n",
" -- 规格/含量匹配\n",
" AND COALESCE(b.stgh_des, '') = CASE WHEN tblmkt.Strength IS NULL THEN COALESCE(b.stgh_des, '') ELSE tblmkt.Strength END\n",
"\n",
" -- 集团 & 生产企业匹配\n",
" AND COALESCE(b.corp_cod, '') = CASE WHEN tblmkt.Corporation_Code IS NULL THEN COALESCE(b.corp_cod, '') ELSE tblmkt.Corporation_Code END\n",
" AND COALESCE(b.manu_cod, '') = CASE WHEN tblmkt.Manufacturer_Code IS NULL THEN COALESCE(b.manu_cod, '') ELSE tblmkt.Manufacturer_Code END\n",
"\n",
" -- IQVIA 产品编码匹配(补足 9 位后比对)\n",
" AND RIGHT(CONCAT('000000000', COALESCE(b.iqvia_prod_code, 0)), 9)\n",
" = CASE WHEN tblmkt.Product_Code IS NULL\n",
" THEN RIGHT(CONCAT('000000000', COALESCE(b.iqvia_prod_code, 0)), 9)\n",
" ELSE RIGHT(CONCAT('000000000', tblmkt.Product_Code), 9)\n",
" END\n",
"\n",
" -- IQVIA 包装编码匹配(纯数字补足 12 位,非数字直接比对)\n",
" AND IF(\n",
" COALESCE(b.iqvia_pack_code, 0) REGEXP '^[0-9]',\n",
" RIGHT(CONCAT('000000000000', COALESCE(b.iqvia_pack_code, 0)), 12),\n",
" COALESCE(b.iqvia_pack_code, 0)\n",
" )\n",
" = CASE WHEN tblmkt.Pack_Code IS NULL\n",
" THEN IF(\n",
" COALESCE(b.iqvia_pack_code, 0) REGEXP '^[0-9]',\n",
" RIGHT(CONCAT('000000000000', COALESCE(b.iqvia_pack_code, 0)), 12),\n",
" COALESCE(b.iqvia_pack_code, 0)\n",
" )\n",
" ELSE IF(\n",
" tblmkt.Pack_Code REGEXP '^[0-9]',\n",
" RIGHT(CONCAT('000000000000', tblmkt.Pack_Code), 12),\n",
" tblmkt.Pack_Code\n",
" )\n",
" END\n",
"\n",
" -- 化合物编码匹配(补足 6 位后比对)\n",
" AND RIGHT(CONCAT('000000', COALESCE(b.CMPS_COD, 0)), 6)\n",
" = CASE WHEN tblmkt.Molecule_Code IS NULL\n",
" THEN RIGHT(CONCAT('000000', COALESCE(b.CMPS_COD, 0)), 6)\n",
" ELSE RIGHT(CONCAT('000000', tblmkt.Molecule_Code), 6)\n",
" END\n",
"\n",
"-- ────────────── 最终过滤:只保留匹配到市场规则的包装 ──────────────\n",
"WHERE tblmkt.market IS NOT NULL;\n",
"\n",
"\n",
"insert overwrite table tmp.tmp_ec_temp_market_del \n",
"-- ============================================================\n",
"-- 药品包装属性维度宽表\n",
"-- 来源IQVIA 零售包装属性 + NRDL 补充属性 + 市场归属规则\n",
"-- 核心逻辑基于多维度模糊匹配将包装映射到市场Market/BU\n",
"-- 过滤条件:仅保留能匹配到市场的记录\n",
"-- ============================================================\n",
"SELECT DISTINCT\n",
"\n",
" -- ────────────── 基础标识码(统一格式化补零)──────────────\n",
" b.iqvia_lineno,\n",
"\n",
" -- IQVIA 包装编码:纯数字补足 12 位,非数字直接保留\n",
" IF(\n",
" NVL(b.iqvia_pack_code, 0) REGEXP '^[0-9]',\n",
" RIGHT(CONCAT('000000000000', NVL(b.iqvia_pack_code, 0)), 12),\n",
" NVL(b.iqvia_pack_code, 0)\n",
" ) AS iqvia_pack_code,\n",
"\n",
" -- IQVIA 产品编码:补足 9 位\n",
" RIGHT(CONCAT('000000000', NVL(b.iqvia_prod_code, 0)), 9) AS prod_cod,\n",
"\n",
" -- ────────────── 基础属性标记 ──────────────\n",
" b.iqvia_notes,\n",
" b.new_pack_flag, -- 新包装标记\n",
" b.is_exists_chpa, -- 是否存在 CHPA 数据\n",
"\n",
" -- 中康产品 ID补足 7 位\n",
" RIGHT(CONCAT('0000000', NVL(b.product_id, 0)), 7) AS product_id,\n",
"\n",
" -- ────────────── 药品属性 ──────────────\n",
" b.prescription_nature, -- 处方性质Rx/OTC\n",
" b.medicine_type, -- 药品类型\n",
" b.zk_medicine_tier1, -- 中康分类层级 1~4\n",
" b.zk_medicine_tier2,\n",
" b.zk_medicine_tier3,\n",
" b.zk_medicine_tier4,\n",
" b.common_name, -- 通用名\n",
" b.dosage_form, -- 剂型\n",
" b.user_type,\n",
" b.category_name,\n",
" b.product_name,\n",
" b.brand_name, -- 品牌名\n",
"\n",
" -- ────────────── 厂商及规格 ──────────────\n",
" b.zk_manu_des, -- 生产企业(中康)\n",
" b.zk_corp_des, -- 集团企业(中康)\n",
" b.zk_pack_des, -- 包装规格(中康)\n",
" b.counting_unit_a,\n",
" b.dosage_unit_a,\n",
" b.unit_a,\n",
"\n",
" -- ────────────── NFC 分类APP 层级:治疗大类/亚类/品类)──────────────\n",
" b.app1_cod, b.app1_des, b.app1_des_c,\n",
" b.app2_cod, b.app2_des, b.app2_des_c,\n",
" b.app3_cod, b.app3_des, b.app3_des_c,\n",
"\n",
" -- ────────────── ATC 分类WHO 解剖治疗化学分类 1~4 级)──────────────\n",
" b.atc1_cod, b.atc1_des, b.atc1_des_c,\n",
" b.atc2_cod, b.atc2_des, b.atc2_des_c,\n",
" b.atc3_cod, b.atc3_des, b.atc3_des_c,\n",
" b.atc4_cod, b.atc4_des, b.atc4_des_c,\n",
"\n",
" -- ────────────── 药品政策属性 ──────────────\n",
" b.bio_desc, -- 生物药标记\n",
" RIGHT(CONCAT('000000', NVL(b.cmps_cod, 0)), 6) AS cmps_cod, -- 化合物编码:补足 6 位\n",
" b.cmps_des, b.cmps_des_c,\n",
" b.corp_cod, b.corp_des, b.corp_des_c, -- 集团编码\n",
" b.edl_desc, -- 基本药物目录标记\n",
" b.eth_otc_desc, -- 处方/非处方标记\n",
" b.gene_orig_desc, -- 原研/仿制标记\n",
" b.gqce_desc, -- 一致性评价标记\n",
" b.manu_cod, b.manu_des, b.manu_des_c, -- 生产企业编码\n",
" b.mnfl_cod, b.mnfl_des,\n",
" b.nrdl_desc, -- 国家医保目录标记\n",
" b.pack_des,\n",
" b.stgh_des, -- 规格/含量描述\n",
" b.pack_lch,\n",
" b.paed_desc, -- 儿科用药标记\n",
" b.prod_des, b.prod_des_c,\n",
" b.tcm_desc, -- 中药标记\n",
" b.vbp_desc, -- 集采中选标记\n",
" b.unit,\n",
" b.counting_unit,\n",
" b.dosage_unit,\n",
"\n",
" -- ────────────── 补充维度(来自关联表)──────────────\n",
" NVL(mole.NRDL_Entry_Date, '') AS NRDL_ENTRY_DATE, -- 进入医保目录日期\n",
" tblmkt.Market, -- 市场名称\n",
" tblmkt.bu, -- BU 归属\n",
" NVL(tblmkt.extend_market_ratio, 1) AS extend_market_ratio, -- 扩展市场系数(默认 1\n",
"\n",
" -- AZ 品牌标记:判断集团企业是否为阿斯利康\n",
" IF(b.corp_des_c IN ('阿斯利康制药集团'), 'Y', 'N') AS is_az\n",
"\n",
"FROM dwd.dwd_gnd_ext_retail_pack_property AS b\n",
"\n",
"-- ────────────── JOIN 1关联 NRDL 辅助属性(左连接,按包装编码)──────────────\n",
"LEFT JOIN dwd.dwd_ims_td_pack_additional_attribute mole\n",
" ON b.iqvia_pack_code = mole.Pack_Code\n",
"\n",
"-- ────────────── JOIN 2关联市场归属规则表多维度模糊匹配──────────────\n",
"-- 规则:规则表中为 NULL 的维度视为\"通配符\",允许任意值匹配(即不做限制)\n",
"-- 过滤仅使用非扩展市场extend_market IS NULL且有效规则NOT_IN_FLAG 为空或为 '1'\n",
"LEFT JOIN (\n",
" SELECT\n",
" market, bu,\n",
" atc1_code, atc2_code, atc3_code, atc4_code,\n",
" nfc1_code, nfc2_code, nfc3_code,\n",
" pack_code, pack_desc, strength,\n",
" product_code, product_desc,\n",
" molecule_code, molecule_desc,\n",
" not_in_flag, extend_market, extend_market_ratio,\n",
" corporation_code, corporation_desc,\n",
" manufacturer_code, manufacturer_desc\n",
" FROM EC_TBLMARKET_BYMONTH\n",
" where Extend_Market is null and NOT_IN_FLAG = '0'\n",
") tblmkt\n",
"ON\n",
" -- ATC 四级分类匹配(规则为 NULL 则通配)\n",
" COALESCE(b.ATC1_COD, '') = CASE WHEN tblmkt.ATC1_Code IS NULL THEN COALESCE(b.ATC1_COD, '') ELSE tblmkt.ATC1_Code END\n",
" AND COALESCE(b.ATC2_COD, '') = CASE WHEN tblmkt.ATC2_Code IS NULL THEN COALESCE(b.ATC2_COD, '') ELSE tblmkt.ATC2_Code END\n",
" AND COALESCE(b.ATC3_COD, '') = CASE WHEN tblmkt.ATC3_Code IS NULL THEN COALESCE(b.ATC3_COD, '') ELSE tblmkt.ATC3_Code END\n",
" AND COALESCE(b.ATC4_COD, '') = CASE WHEN tblmkt.ATC4_Code IS NULL THEN COALESCE(b.ATC4_COD, '') ELSE tblmkt.ATC4_Code END\n",
"\n",
" -- NFC 三级分类匹配\n",
" AND COALESCE(b.APP1_COD, '') = CASE WHEN tblmkt.NFC1_Code IS NULL THEN COALESCE(b.APP1_COD, '') ELSE tblmkt.NFC1_Code END\n",
" AND COALESCE(b.APP2_COD, '') = CASE WHEN tblmkt.NFC2_Code IS NULL THEN COALESCE(b.APP2_COD, '') ELSE tblmkt.NFC2_Code END\n",
" AND COALESCE(b.app3_cod, '') = CASE WHEN tblmkt.NFC3_Code IS NULL THEN COALESCE(b.app3_cod, '') ELSE tblmkt.NFC3_Code END\n",
"\n",
" -- 规格/含量匹配\n",
" AND COALESCE(b.stgh_des, '') = CASE WHEN tblmkt.Strength IS NULL THEN COALESCE(b.stgh_des, '') ELSE tblmkt.Strength END\n",
"\n",
" -- 集团 & 生产企业匹配\n",
" AND COALESCE(b.corp_cod, '') = CASE WHEN tblmkt.Corporation_Code IS NULL THEN COALESCE(b.corp_cod, '') ELSE tblmkt.Corporation_Code END\n",
" AND COALESCE(b.manu_cod, '') = CASE WHEN tblmkt.Manufacturer_Code IS NULL THEN COALESCE(b.manu_cod, '') ELSE tblmkt.Manufacturer_Code END\n",
"\n",
" -- IQVIA 产品编码匹配(补足 9 位后比对)\n",
" AND RIGHT(CONCAT('000000000', COALESCE(b.iqvia_prod_code, 0)), 9)\n",
" = CASE WHEN tblmkt.Product_Code IS NULL\n",
" THEN RIGHT(CONCAT('000000000', COALESCE(b.iqvia_prod_code, 0)), 9)\n",
" ELSE RIGHT(CONCAT('000000000', tblmkt.Product_Code), 9)\n",
" END\n",
"\n",
" -- IQVIA 包装编码匹配(纯数字补足 12 位,非数字直接比对)\n",
" AND IF(\n",
" COALESCE(b.iqvia_pack_code, 0) REGEXP '^[0-9]',\n",
" RIGHT(CONCAT('000000000000', COALESCE(b.iqvia_pack_code, 0)), 12),\n",
" COALESCE(b.iqvia_pack_code, 0)\n",
" )\n",
" = CASE WHEN tblmkt.Pack_Code IS NULL\n",
" THEN IF(\n",
" COALESCE(b.iqvia_pack_code, 0) REGEXP '^[0-9]',\n",
" RIGHT(CONCAT('000000000000', COALESCE(b.iqvia_pack_code, 0)), 12),\n",
" COALESCE(b.iqvia_pack_code, 0)\n",
" )\n",
" ELSE IF(\n",
" tblmkt.Pack_Code REGEXP '^[0-9]',\n",
" RIGHT(CONCAT('000000000000', tblmkt.Pack_Code), 12),\n",
" tblmkt.Pack_Code\n",
" )\n",
" END\n",
"\n",
" -- 化合物编码匹配(补足 6 位后比对)\n",
" AND RIGHT(CONCAT('000000', COALESCE(b.CMPS_COD, 0)), 6)\n",
" = CASE WHEN tblmkt.Molecule_Code IS NULL\n",
" THEN RIGHT(CONCAT('000000', COALESCE(b.CMPS_COD, 0)), 6)\n",
" ELSE RIGHT(CONCAT('000000', tblmkt.Molecule_Code), 6)\n",
" END\n",
"\n",
"-- ────────────── 最终过滤:只保留匹配到市场规则的包装 ──────────────\n",
"WHERE tblmkt.market IS NOT NULL;\n",
"\n",
"MERGE INTO tmp.tmp_ec_temp_market AS t1\n",
"USING tmp.tmp_ec_temp_market_del AS t2\n",
"\t on COALESCE(t1.ATC1_COD,'') = COALESCE(t2.ATC1_COD,'')\n",
" and COALESCE(t1.ATC2_COD,'') = COALESCE(t2.ATC2_COD,'')\n",
" and COALESCE(t1.ATC3_COD,'') = COALESCE(t2.ATC3_COD,'')\n",
" and COALESCE(t1.ATC4_COD,'') = COALESCE(t2.ATC4_COD,'')\n",
" and COALESCE(t1.APP1_COD,'') = COALESCE(t2.APP1_COD,'')\n",
" and COALESCE(t1.APP2_COD,'') = COALESCE(t2.APP2_COD,'')\n",
" and COALESCE(t1.APP3_COD,'') = COALESCE(t2.APP3_COD,'')\n",
" and COALESCE(t1.CORP_COD,'') = COALESCE(t2.CORP_COD,'')\n",
" and COALESCE(t1.MANU_COD,'') = COALESCE(t2.MANU_COD,'')\n",
" and COALESCE(t1.PROD_COD,'') = COALESCE(t2.PROD_COD,'')\n",
" and COALESCE(t1.iqvia_pack_code,'') = COALESCE(t2.iqvia_pack_code,'')\n",
" and COALESCE(t1.STGH_DES,'') = COALESCE(t2.STGH_DES,'')\n",
" and COALESCE(t1.CMPS_COD,'') = COALESCE(t2.CMPS_COD,'')\n",
" and COALESCE(t1.market,'') = COALESCE(t2.market,'')\n",
"WHEN MATCHED THEN DELETE ;\n"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778478993866,
"inputWidgets": {},
"nuid": "85453796-9385-4a5a-bf20-6bfd459580ae",
"showTitle": false,
"startTime": 1778478991550,
"submitTime": 1778478972052,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"--处理 Extend_Market 有值得数据,用已有市场,定义新的市场,带上系数\n",
"insert into tmp.tmp_ec_temp_market\n",
"select\n",
"iqvia_lineno,iqvia_pack_code,prod_cod,iqvia_notes,new_pack_flag,is_exists_chpa,product_id,prescription_nature,medicine_type,zk_medicine_tier1,zk_medicine_tier2,zk_medicine_tier3,zk_medicine_tier4,common_name,dosage_form,user_type,category_name,product_name,brand_name,zk_manu_des,zk_corp_des,zk_pack_des,counting_unit_a,dosage_unit_a,unit_a,app1_cod,app1_des,app1_des_c,app2_cod,app2_des,app2_des_c,app3_cod,app3_des,app3_des_c,atc1_cod,atc1_des,atc1_des_c,atc2_cod,atc2_des,atc2_des_c,atc3_cod,atc3_des,atc3_des_c,atc4_cod,atc4_des,atc4_des_c,bio_desc,cmps_cod,cmps_des,cmps_des_c,corp_cod,corp_des,corp_des_c,edl_desc,eth_otc_desc,gene_orig_desc,gqce_desc,manu_cod,manu_des,manu_des_c,mnfl_cod,mnfl_des,nrdl_desc,pack_des,stgh_des,pack_lch,paed_desc,prod_des,prod_des_c,tcm_desc,vbp_desc,unit,counting_unit,dosage_unit,NRDL_ENTRY_DATE,t2.Market,t2.bu,nvl(t2.extend_market_ratio,1) as extend_market_ratio,is_az\n",
"from tmp.tmp_ec_temp_market t1\n",
"left join (select Market,BU,Extend_Market,Extend_Market_Ratio from dwd.dwd_gnd_ec_retail_tblmarket_rule where Extend_Market is not null )t2\n",
"on t1.Market = t2.Extend_Market\n",
"where t2.Market is not null"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778479009600,
"inputWidgets": {},
"nuid": "015ef590-887b-4dfa-bfa1-ebd05effc2cf",
"showTitle": false,
"startTime": 1778478993870,
"submitTime": 1778478972058,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-----------事实表数据处理获取counting_unit字段给特殊字段补0并对数据去重\n",
"insert overwrite table tmp.tmp_ec_source \n",
"select \n",
" a.time as yyyymm,\n",
" right(concat('0000000',a.product_id),7) as pack_id,\n",
" if( b.iqvia_pack_code REGEXP '^[0-9]',right(concat('000000000000',b.iqvia_pack_code),12),b.iqvia_pack_code) as iqvia_pack_code, --right(concat('0000000',b.iqvia_pack_code),7)\n",
" a.platform,\n",
" a.store_name,\n",
" a.store_type,\n",
" sum(a.sales_amount) as sales_value,\n",
" sum(a.sales_qty) as sales_unit,\n",
" cast(sum(a.sales_qty*(b.counting_unit/coalesce(unit,1 ))) as decimal(30,10)) as counting_unit\n",
"from dwd.dwd_inc_gnd_ext_ec_nationnal_pack_union_all a\n",
"left join (\n",
" select DISTINCT product_id,iqvia_pack_code,counting_unit,unit,prod_des_c\n",
" from dwd.dwd_gnd_ext_retail_pack_property) b\n",
"on right(concat('0000000',a.product_id),7) = right(concat('0000000',b.product_id),7)\n",
"group by\n",
" a.`time`,right(concat('0000000',a.product_id),7) \n",
" ,if( b.iqvia_pack_code REGEXP '^[0-9]',right(concat('000000000000',b.iqvia_pack_code),12),b.iqvia_pack_code)\n",
" ,a.platform,a.store_name\n",
" ,a.store_type"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557198314,
"inputWidgets": {},
"nuid": "339d06b1-1c67-4249-a105-aaafb352bb38",
"showTitle": false,
"startTime": 1778557189165,
"submitTime": 1778557188224,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-- [2026-04-30] NIAD 保持月度粒度,非 NIAD 聚合为季度(季末月 yyyymm 格式,如 Q1→202603\n",
"-- 聚合点从 tmp_ec_source 移到 dws 层tmp_ec_source 保持月度原始粒度\n",
"-- 非 NIAD 季度聚合后 store_name 不再有意义,置为空字符串\n",
"insert overwrite table dws.dws_zk_ec_sales \n",
"select\n",
" t1.yyyymm,t1.pack_id,t1.iqvia_pack_code,t1.platform,t1.store_name,t1.store_type,\n",
" sum(sales_value) as sales_value,\n",
" sum(sales_unit) as sales_unit,\n",
" sum(counting_unit) as counting_unit\n",
"from tmp.tmp_ec_source t1\n",
"group by\n",
" t1.yyyymm,t1.pack_id,t1.iqvia_pack_code,t1.platform,t1.store_name,t1.store_type"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"collapsed": true,
"finishTime": 1778557198321,
"inputWidgets": {},
"nuid": "c686ec31-8c18-4a4a-96ca-ce5a29f2f676",
"showTitle": false,
"startTime": 1778557198319,
"submitTime": 1778557188234,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-- [2026-04-30] 已注释:倒减前置准备 - TA大数表构建\n",
"-- 此 cell 构建 dws.dws_zk_ec_by_ta_top_corp仅被 Cell 8-10 倒减逻辑使用\n",
"-- 倒减已注释,暂不需要此表\n",
"-- 如需恢复倒减,取消此 cell 注释即可\n",
"\n",
"-- insert overwrite table dws.dws_zk_ec_by_ta_top_corp \n",
"-- select\n",
"-- t1.yyyymm,\n",
"-- t1.ta,\n",
"-- t1.rank,\n",
"-- t1.corp_des,\n",
"-- t1.CORP_COD,\n",
"-- t1.platform,\n",
"-- t1.store_type,\n",
"-- sum(t1.sales_value) sales_value\n",
"-- from ( \n",
"-- select\n",
"-- a.ytd yyyymm,\n",
"-- a.ta,\n",
"-- a.rank,\n",
"-- a.corp_des,\n",
"-- b.CORP_COD,\n",
"-- a.platform,\n",
"-- a.store_type,\n",
"-- replace(a.sales_value,',','') as sales_value\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) b \n",
"-- on b.ZK_Corp_C = a.corp_des \n",
"-- ) t1\n",
"-- group by 1,2,3,4,5,6,7"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"collapsed": true,
"finishTime": 1778557198329,
"inputWidgets": {},
"nuid": "7814d185-5883-4f00-b350-0d5cab1da7f5",
"showTitle": false,
"startTime": 1778557198326,
"submitTime": 1778557188239,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-- [2026-04-30] 已注释:倒减前置准备 - TA大数表构建与 Cell 5 重复,历史遗留代码)\n",
"-- 如需恢复倒减,取消此 cell 注释即可\n",
"\n",
"-- insert overwrite table dws.dws_zk_ec_by_ta_top_corp \n",
"-- select\n",
"-- t1.yyyymm,\n",
"-- t1.ta,\n",
"-- t1.rank,\n",
"-- t1.corp_des,\n",
"-- t1.CORP_COD,\n",
"-- t1.platform,\n",
"-- t1.store_type,\n",
"-- sum(t1.sales_value) sales_value\n",
"-- from( \n",
"-- select\n",
"-- a.ytd yyyymm,\n",
"-- a.ta,\n",
"-- a.rank,\n",
"-- a.corp_des,\n",
"-- b.CORP_COD,\n",
"-- a.platform,\n",
"-- a.store_type,\n",
"-- replace(a.sales_value,',','') as sales_value\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) b \n",
"-- on b.ZK_Corp_C = a.corp_des\n",
"-- )t1\n",
"-- group by 1,2,3,4,5,6,7"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557203672,
"inputWidgets": {},
"nuid": "b576e313-2815-4991-a92e-82fe68cbaed9",
"showTitle": false,
"startTime": 1778557198332,
"submitTime": 1778557188244,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"----倒减需要用到公司信息以及ta信息加工配置表挂靠Corp、ta\n",
"insert overwrite table tmp.tmp_zk_ec_pack_property_corp \n",
"select distinct a.product_id,a.iqvia_pack_code,a.Market,ta.ta\n",
" ,COALESCE(c.corp_cod,b.corp_cod,a.corp_cod) corp_cod\n",
" ,COALESCE(c.corp_des,b.corp_des,a.corp_des) corp_des\n",
" ,COALESCE(d.corp_des_c,a.corp_des_c ) corp_des_c\n",
" ,COALESCE(c.manu_cod,b.manu_cod,a.manu_cod) manu_cod \n",
" ,COALESCE(c.manu_des,b.manu_des,a.manu_des) manu_des \n",
" ,COALESCE(e.manu_des_c,a.manu_des_c) manu_des_c\n",
"from (select DISTINCT product_id,iqvia_pack_code,Market,corp_cod,corp_des,corp_des_c,manu_cod,manu_des,manu_des_c,prod_cod from tmp.tmp_ec_temp_market) a \n",
"left join dwd.dwd_gnd_ext_retail_dim_ta ta\n",
"on a.Market = ta.market\n",
"left join (select right(concat('000000000',prod_cod ),9) prod_cod,corp_cod,corp_des,manu_cod,manu_des from dwd.dwd_gnd_tbl_corp_change where pack_cod is null ) b \n",
"on right(concat('000000000',A.prod_cod ),9)= b.prod_cod\n",
"left join (select if( pack_cod REGEXP '^[0-9]',right(concat('000000000000',pack_cod),12),pack_cod) pack_cod,corp_cod,corp_des,manu_cod,manu_des from dwd.dwd_gnd_tbl_corp_change where pack_cod is not null ) c \n",
"on a.iqvia_pack_code = c.pack_cod\n",
"left join (select distinct corp_cod,corp_des_c from dwd.dwd_gnd_ext_retail_pack_property) d \n",
"on coalesce(C.corp_cod,B.corp_cod ) = d.corp_cod \n",
"Left join (select distinct manu_cod,manu_des,manu_des_c from dwd.dwd_gnd_ext_retail_pack_property) e \n",
"On coalesce(C.manu_cod,B.manu_cod ) = e.manu_cod "
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"collapsed": true,
"finishTime": 1778557203681,
"inputWidgets": {},
"nuid": "5fdbf78f-228d-4e26-94b8-94565feb2ddf",
"showTitle": false,
"startTime": 1778557203677,
"submitTime": 1778557188250,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-- [2026-04-30] 已注释CV 倒减逻辑\n",
"-- 原逻辑:从 dws_zk_ec_sales 取 CV 数据,分离 AZ/非 AZ用大数倒减出 CV_OTHERS 和 CV_AZ_OTHERS\n",
"-- 如需恢复倒减,取消此 cell 注释即可\n",
"\n",
"-- insert overwrite table tmp.tmp_dm_zk_ec_sales_cv_tmp \n",
"-- with cv_data as (\n",
"-- select\n",
"-- t1.yyyymm,\n",
"-- t1.pack_id,\n",
"-- t1.iqvia_pack_code,\n",
"-- t1.platform,\n",
"-- t1.store_type,\n",
"-- t1.store_name,\n",
"-- t1.sales_value,\n",
"-- t1.sales_unit,\n",
"-- t1.counting_unit,\n",
"-- max(t2.ta) ta\n",
"-- from dws.dws_zk_ec_sales t1\n",
"-- left join (select distinct iqvia_pack_code,ta from tmp.tmp_zk_ec_pack_property_corp) t2\n",
"-- on t1.iqvia_pack_code = t2.iqvia_pack_code\n",
"-- where t2.ta = 'CV'\n",
"-- group by 1,2,3,4,5,6,7,8,9\n",
"-- ),cv_corp_data as (\n",
"-- select\n",
"-- A.yyyymm,\n",
"-- A.pack_id,\n",
"-- A.iqvia_pack_code,\n",
"-- A.platform,\n",
"-- A.store_type,\n",
"-- A.store_name,\n",
"-- B.corp_cod,\n",
"-- A.sales_value,\n",
"-- A.sales_unit,\n",
"-- A.counting_unit,\n",
"-- A.ta\n",
"-- from cv_data A \n",
"-- inner join(select distinct iqvia_pack_code,corp_cod,product_id from tmp.tmp_zk_ec_pack_property_corp) B \n",
"-- on A.pack_id = B.product_id\n",
"-- where B.corp_cod = 'A5Z'\n",
"-- union all \n",
"-- select\n",
"-- cv_az.yyyymm,\n",
"-- 'CV_AZ_OTHERS' as pack_id,\n",
"-- 'CV_AZ_OTHERS' as iqvia_pack_code,\n",
"-- cv_az.platform,\n",
"-- cv_az.store_type,\n",
"-- case when cv_az.store_type = '自营旗舰' then 'CV_AZ_OTHERS_SO' when cv_az.store_type = '第三方' then 'CV_AZ_OTHERS_POP' end store_name,\n",
"-- cv_az.corp_cod,\n",
"-- cv_az_total.sales_value - cv_az.sales_value as sales_value,\n",
"-- 0,0,\n",
"-- 'CV_AZ_OTHERS' as ta\n",
"-- from ( \n",
"-- select\n",
"-- A.yyyymm,\n",
"-- B.corp_cod,\n",
"-- A.platform,\n",
"-- case when A.store_type = '平台店' or A.store_type = '品牌店' then '自营旗舰' else A.store_type end store_type,\n",
"-- sum(A.sales_value) sales_value\n",
"-- from cv_data A \n",
"-- inner join(select distinct iqvia_pack_code,corp_cod,product_id from tmp.tmp_zk_ec_pack_property_corp) B \n",
"-- on A.pack_id = B.product_id\n",
"-- where B.corp_cod = 'A5Z'\n",
"-- group by 1,2,3,4\n",
"-- )cv_az\n",
"-- left join(\n",
"-- select\n",
"-- yyyymm,\n",
"-- CORP_COD,\n",
"-- platform,\n",
"-- case when store_type = '三方' then '第三方' else store_type end store_type, \n",
"-- sum(sales_value) sales_value\n",
"-- from dws.dws_zk_ec_by_ta_top_corp\n",
"-- where ta = 'CV' and CORP_COD = 'A5Z'\n",
"-- group by 1,2,3,4\n",
"-- )cv_az_total\n",
"-- on cv_az.yyyymm = cv_az_total.yyyymm \n",
"-- and cv_az.corp_cod = cv_az_total.CORP_COD \n",
"-- and cv_az.platform = cv_az_total.platform\n",
"-- and cv_az.store_type = cv_az_total.store_type\n",
"-- union all \n",
"-- select\n",
"-- A.yyyymm,\n",
"-- A.pack_id,\n",
"-- A.iqvia_pack_code,\n",
"-- A.platform,\n",
"-- A.store_type,\n",
"-- A.store_name,\n",
"-- B.corp_cod,\n",
"-- A.sales_value,\n",
"-- A.sales_unit,\n",
"-- A.counting_unit,\n",
"-- A.ta\n",
"-- from cv_data A \n",
"-- inner join(select distinct iqvia_pack_code,corp_cod,product_id from tmp.tmp_zk_ec_pack_property_corp) B \n",
"-- on A.pack_id = B.product_id\n",
"-- where nvl(corp_cod,'') <>'A5Z'\n",
"-- )\n",
"-- ,all_cv_data as (\n",
"-- select \n",
"-- yyyymm,\n",
"-- pack_id,\n",
"-- iqvia_pack_code,\n",
"-- platform,\n",
"-- store_type,\n",
"-- store_name,\n",
"-- corp_cod,\n",
"-- sales_value,\n",
"-- sales_unit,\n",
"-- counting_unit,\n",
"-- 'CV' flag,\n",
"-- ta\n",
"-- from cv_corp_data\n",
"-- union all \n",
"-- select\n",
"-- t1.yyyymm,\n",
"-- 'CV_OTHERS' as pack_id,\n",
"-- 'CV_OTHERS' as iqvia_pack_code,\n",
"-- t1.platform,\n",
"-- t1.store_type,\n",
"-- case when t1.store_type = '自营旗舰' then 'CV_OTHERS_SO' when t1.store_type = '第三方' then 'CV_OTHERS_POP' end store_name,\n",
"-- 'CV_OTHERS' as corp_cod,\n",
"-- t2.sales_value - t1.sales_value as sales_value,\n",
"-- 0,0,\n",
"-- 'CV' as flag,\n",
"-- 'CV_OTHERS' as ta\n",
"-- from( \n",
"-- select\n",
"-- yyyymm,\n",
"-- platform,\n",
"-- case when store_type = '平台店' or store_type = '品牌店' then '自营旗舰' else store_type end store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from cv_corp_data \n",
"-- group by 1,2,3\n",
"-- )t1\n",
"-- left join(\n",
"-- select\n",
"-- yyyymm,\n",
"-- platform,\n",
"-- case when store_type = '三方' then '第三方' else store_type end store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from dws.dws_zk_ec_by_ta_top_corp\n",
"-- where ta = 'CV' and lower(rank) = 'total'\n",
"-- group by 1,2,3\n",
"-- )t2\n",
"-- on t1.yyyymm = t2.yyyymm and t1.platform = t2.platform and t1.store_type = t2.store_type\n",
"-- ),non_cv_all_data as (\n",
"-- select \n",
"-- t1.yyyymm,\n",
"-- t1.pack_id,\n",
"-- t1.iqvia_pack_code,\n",
"-- t1.platform,\n",
"-- t1.store_type,\n",
"-- t1.store_name,\n",
"-- t2.corp_cod,\n",
"-- t1.sales_value,\n",
"-- t1.sales_unit,\n",
"-- t1.counting_unit,\n",
"-- case when t2.ta in ('DM','RD') then 'CVRM' else '' end flag,\n",
"-- max(t2.ta) ta\n",
"-- from dws.dws_zk_ec_sales t1\n",
"-- left join (select distinct iqvia_pack_code,ta,corp_cod,product_id from tmp.tmp_zk_ec_pack_property_corp) t2\n",
"-- on t1.pack_id = t2.product_id\n",
"-- where nvl(t2.TA,'') <> 'CV'\n",
"-- group by 1,2,3,4,5,6,7,8,9,10,11\n",
"-- )\n",
"-- select * from all_cv_data\n",
"-- union \n",
"-- select * from non_cv_all_data"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"collapsed": true,
"finishTime": 1778557203688,
"inputWidgets": {},
"nuid": "b1f69228-3a47-4a76-ab21-a10e52305a56",
"showTitle": false,
"startTime": 1778557203685,
"submitTime": 1778557188256,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-- [2026-04-30] 已注释CVRM 倒减逻辑\n",
"-- 原逻辑:在 CV 倒减基础上,用大数倒减出 CVRM_OTHERS 和 CVRM_AZ_OTHERS\n",
"-- 如需恢复倒减,取消此 cell 注释即可\n",
"\n",
"-- insert overwrite table tmp.tmp_dm_zk_ec_sales_cv_tmp2 \n",
"-- with all_data as (\n",
"-- select \n",
"-- yyyymm,\n",
"-- pack_id,\n",
"-- iqvia_pack_code,\n",
"-- platform,\n",
"-- store_type,\n",
"-- store_name,\n",
"-- corp_cod,\n",
"-- sales_value,\n",
"-- sales_unit,\n",
"-- counting_unit,\n",
"-- flag\n",
"-- from tmp.tmp_dm_zk_ec_sales_cv_tmp\n",
"-- union all \n",
"-- select\n",
"-- t1.yyyymm,\n",
"-- 'CVRM_AZ_OTHERS' as pack_id,\n",
"-- 'CVRM_AZ_OTHERS' as iqvia_pack_code,\n",
"-- t1.platform,\n",
"-- t1.store_type,\n",
"-- case when t1.store_type = '自营旗舰' then 'CVRM_AZ_OTHERS_SO' when t1.store_type = '第三方' then 'CVRM_AZ_OTHERS_POP' end store_name,\n",
"-- t1.corp_cod,\n",
"-- t2.sales_value - t1.sales_value as sales_value,\n",
"-- 0,0,\n",
"-- 'CVRM' as flag\n",
"-- from( \n",
"-- select \n",
"-- yyyymm,\n",
"-- corp_cod,\n",
"-- platform,\n",
"-- case when store_type = '平台店' or store_type = '品牌店' then '自营旗舰' else store_type end store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from tmp.tmp_dm_zk_ec_sales_cv_tmp\n",
"-- where corp_cod = 'A5Z' and flag in ('CV','CVRM') \n",
"-- group by 1,2,3,4\n",
"-- )t1\n",
"-- left join (\n",
"-- select\n",
"-- yyyymm,\n",
"-- CORP_COD,\n",
"-- platform,\n",
"-- case when store_type = '三方' then '第三方' else store_type end store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from dws.dws_zk_ec_by_ta_top_corp\n",
"-- where CORP_COD = 'A5Z' and ta = 'CVRM'\n",
"-- group by 1,2,3,4\n",
"-- )t2\n",
"-- on t1.yyyymm = t2.yyyymm and t1.platform = t2.platform and t1.store_type = t2.store_type\n",
"-- )\n",
"-- select\n",
"-- yyyymm,\n",
"-- pack_id,\n",
"-- iqvia_pack_code,\n",
"-- platform,\n",
"-- store_type,\n",
"-- store_name,\n",
"-- corp_cod,\n",
"-- sales_value,\n",
"-- sales_unit,\n",
"-- counting_unit,\n",
"-- flag\n",
"-- from all_data\n",
"-- union all \n",
"-- select\n",
"-- t1.yyyymm,\n",
"-- 'CVRM_OTHERS' as pack_id,\n",
"-- 'CVRM_OTHERS' as iqvia_pack_code,\n",
"-- t1.platform,\n",
"-- t1.store_type,\n",
"-- case when t1.store_type = '自营旗舰' then 'CVRM_OTHERS_SO' when t1.store_type = '第三方' then 'CVRM_OTHERS_POP' end store_name,\n",
"-- 'CVRM_OTHERS' as corp_cod,\n",
"-- t2.sales_value - t1.sales_value as sales_value,\n",
"-- 0,0,\n",
"-- 'CVRM' flag\n",
"-- from ( \n",
"-- select\n",
"-- yyyymm,\n",
"-- platform,\n",
"-- case when store_type = '平台店' or store_type = '品牌店' then '自营旗舰' else store_type end store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from all_data \n",
"-- where flag in ('CV','CVRM')\n",
"-- group by 1,2,3\n",
"-- )t1\n",
"-- left join(\n",
"-- select\n",
"-- yyyymm,\n",
"-- platform,\n",
"-- case when store_type = '三方' then '第三方' else store_type end store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from dws.dws_zk_ec_by_ta_top_corp\n",
"-- where ta = 'CVRM' and lower(rank) = 'total'\n",
"-- group by 1,2,3\n",
"-- )t2\n",
"-- on t1.yyyymm = t2.yyyymm and t1.platform = t2.platform and t1.store_type = t2.store_type"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557219728,
"inputWidgets": {},
"nuid": "2c5737c9-b8fe-4b8a-a4b6-f39be69af55c",
"showTitle": false,
"startTime": 1778557203693,
"submitTime": 1778557188260,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-- [2026-04-30] 已注释TA 倒减逻辑(最终倒减步骤)\n",
"-- 原逻辑:用 RX Total 大数倒减出 OTHERS_AZ_TA 和 OTHERS_TA并写入 tmp_dm_zk_ec_sales\n",
"-- 倒减已注释,改为直接从 dws_zk_ec_sales 透传数据\n",
"-- 如需恢复倒减,将下面的透传逻辑替换为原始倒减逻辑\n",
"\n",
"insert overwrite table tmp.tmp_dm_zk_ec_sales \n",
"select distinct\n",
" t1.yyyymm,\n",
" t1.pack_id,\n",
" t1.iqvia_pack_code,\n",
" COALESCE(t2.corp_cod, '') as corp_cod,\n",
" 'ROC' as audit_cod,\n",
" t1.platform,\n",
" case when t1.store_type = '第三方' then 'POP' when t1.store_type in ('平台店','品牌店','自营旗舰') then 'SO' end as store_type,\n",
" store_name,\n",
" 1 as PACK_FLAG,\n",
" 1 as PROD_FLAG,\n",
" '' as flag,\n",
" 'EC(Monthly)' DATA_SOURCE,\n",
" sum(t1.sales_value) sales_value,\n",
" sum(t1.sales_unit) sales_unit,\n",
" sum(t1.counting_unit) counting_unit\n",
"from dws.dws_zk_ec_sales t1\n",
"left join (\n",
" select distinct iqvia_pack_code, corp_cod\n",
" from tmp.tmp_zk_ec_pack_property_corp\n",
") t2 on t1.iqvia_pack_code = t2.iqvia_pack_code\n",
"group by t1.yyyymm, t1.pack_id, t1.iqvia_pack_code, t2.corp_cod, t1.platform, t1.store_type,t1.store_name\n",
"\n",
"-- ========== 原始倒减逻辑(已注释) ==========\n",
"-- insert overwrite table tmp.tmp_dm_zk_ec_sales \n",
"-- with all_data as (\n",
"-- select distinct\n",
"-- yyyymm,\n",
"-- pack_id,\n",
"-- iqvia_pack_code,\n",
"-- platform,\n",
"-- store_type,\n",
"-- store_name,\n",
"-- corp_cod,\n",
"-- sales_value,\n",
"-- sales_unit,\n",
"-- counting_unit,\n",
"-- flag\n",
"-- from tmp.tmp_dm_zk_ec_sales_cv_tmp2\n",
"-- union all\n",
"-- select\n",
"-- t1.yyyymm,\n",
"-- 'OTHERS_AZ_TA' as pack_id,\n",
"-- 'OTHERS_AZ_TA' as iqvia_pack_code,\n",
"-- t1.platform,\n",
"-- t1.store_type,\n",
"-- case when t1.store_type = '自营旗舰' then 'OTHERS_AZ_TA_SO' when t1.store_type = '第三方' then 'OTHERS_AZ_TA_POP' end store_name,\n",
"-- t1.corp_cod,\n",
"-- t2.sales_value - t1.sales_value as sales_value,\n",
"-- 0,0,\n",
"-- 'OTHERS_AZ_TA' as flag\n",
"-- from( \n",
"-- select\n",
"-- yyyymm,\n",
"-- corp_cod,\n",
"-- platform,\n",
"-- case when store_type = '平台店' or store_type = '品牌店' then '自营旗舰' else store_type end store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from tmp.tmp_dm_zk_ec_sales_cv_tmp2\n",
"-- where corp_cod = 'A5Z' \n",
"-- group by 1,2,3,4\n",
"-- )t1\n",
"-- left join (\n",
"-- select\n",
"-- yyyymm,\n",
"-- platform,\n",
"-- store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from dws.dws_zk_ec_by_ta_top_corp\n",
"-- where CORP_COD = 'A5Z' and ta = 'RX Total'\n",
"-- group by 1,2,3\n",
"-- )t2\n",
"-- on t1.yyyymm = t2.yyyymm and t1.platform = t2.platform and t1.store_type = t2.store_type\n",
"-- ),result as (\n",
"-- select\n",
"-- yyyymm,\n",
"-- pack_id,\n",
"-- iqvia_pack_code,\n",
"-- platform,\n",
"-- store_type,\n",
"-- store_name,\n",
"-- corp_cod,\n",
"-- sales_value,\n",
"-- sales_unit,\n",
"-- counting_unit,\n",
"-- flag\n",
"-- from all_data\n",
"-- union all\n",
"-- select\n",
"-- t1.yyyymm,\n",
"-- 'OTHERS_TA' as pack_id,\n",
"-- 'OTHERS_TA' as iqvia_pack_code,\n",
"-- t1.platform,\n",
"-- t1.store_type,\n",
"-- case when t1.store_type = '自营旗舰' then 'OTHERS_TA_SO' when t1.store_type = '第三方' then 'OTHERS_TA_POP' end store_name,\n",
"-- 'OTHERS_TA' as corp_cod,\n",
"-- t2.sales_value - t1.sales_value as sales_value,\n",
"-- 0,0,\n",
"-- 'OTHERS_TA' as flag\n",
"-- from( \n",
"-- select \n",
"-- yyyymm,\n",
"-- platform,\n",
"-- case when store_type = '平台店' or store_type = '品牌店' then '自营旗舰' else store_type end store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from all_data\n",
"-- group by 1,2,3\n",
"-- )t1\n",
"-- left join(\n",
"-- select\n",
"-- yyyymm,\n",
"-- platform,\n",
"-- store_type,\n",
"-- sum(sales_value) sales_value\n",
"-- from dws.dws_zk_ec_by_ta_top_corp\n",
"-- where lower(rank) = 'total' and ta = 'RX Total'\n",
"-- group by 1,2,3\n",
"-- )t2\n",
"-- on t1.yyyymm = t2.yyyymm and t1.platform = t2.platform and t1.store_type = t2.store_type\n",
"-- )\n",
"-- select distinct\n",
"-- yyyymm,\n",
"-- pack_id,\n",
"-- iqvia_pack_code,\n",
"-- corp_cod,\n",
"-- 'ROC' as audit_cod,\n",
"-- platform,\n",
"-- case when store_type = '第三方' then 'POP' when store_type in ('平台店','品牌店','自营旗舰') then 'SO' end store_type,\n",
"-- store_name,\n",
"-- case when iqvia_pack_code like '%OTHERS%' then 0 else 1 end PACK_FLAG,\n",
"-- case when iqvia_pack_code like '%OTHERS%' then 0 else 1 end PROD_FLAG,\n",
"-- flag,\n",
"-- 'EC(Monthly)' DATA_SOURCE,\n",
"-- sum(sales_value) sales_value,\n",
"-- sum(sales_unit) sales_unit,\n",
"-- sum(counting_unit) counting_unit\n",
"-- from result \n",
"-- group by 1,2,3,4,5,6,7,8,9,10,11,12"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557241785,
"inputWidgets": {},
"nuid": "9b43d6a9-6fd4-4568-bc48-7d7cb7ffe266",
"showTitle": false,
"startTime": 1778557219733,
"submitTime": 1778557188268,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"insert overwrite table dm.dm_zk_ec_sales \n",
"select \n",
"yyyymm,\n",
"max(pack_id) as pack_id,\n",
"iqvia_pack_code,\n",
"corp_cod,\n",
"audit_cod,\n",
"platform,\n",
"store_type,\n",
"store_name,\n",
"max(PACK_FLAG) as PACK_FLAG,\n",
"max(PROD_FLAG) as PROD_FLAG,\n",
"max(flag) as flag,\n",
"DATA_SOURCE,\n",
"sum(sales_value) as sales_value,\n",
"sum(sales_value_ly) as sales_value_ly,\n",
"sum(sales_unit) as sales_unit,\n",
"sum(sales_unit_ly) as sales_unit_ly,\n",
"sum(counting_unit) as counting_unit,\n",
"sum(counting_unit_ly) as counting_unit_ly\n",
"from\n",
"(\n",
"select \n",
"yyyymm,\n",
"pack_id,\n",
"iqvia_pack_code,\n",
"corp_cod,\n",
"audit_cod,\n",
"platform,\n",
"store_type,\n",
"store_name,\n",
"PACK_FLAG,\n",
"PROD_FLAG,\n",
"flag,\n",
"DATA_SOURCE,\n",
"sales_value,\n",
"0 as sales_value_ly,\n",
"sales_unit,\n",
"0 as sales_unit_ly,\n",
"counting_unit,\n",
"0 as counting_unit_ly\n",
"from tmp.tmp_dm_zk_ec_sales\n",
"union all\n",
"select\n",
"cast(yyyymm + 100 as int) as yyyymm,\n",
"null as pack_id,\n",
"iqvia_pack_code,\n",
"corp_cod,\n",
"audit_cod,\n",
"platform,\n",
"store_type,\n",
"store_name,\n",
"case when upper(iqvia_pack_code) like '%OTHERS%' then 0 else 1 end as PACK_FLAG,\n",
"case when upper(iqvia_pack_code) like '%OTHERS%' then 0 else 1 end as PROD_FLAG,\n",
"'' as flag,\n",
"DATA_SOURCE,\n",
"0 as sales_value,\n",
"sales_value as sales_value_ly,\n",
"0 as sales_unit,\n",
"sales_unit as sales_unit_ly,\n",
"0 as counting_unit,\n",
"counting_unit as counting_unit_ly\n",
"from tmp.tmp_dm_zk_ec_sales\n",
"where cast(yyyymm + 100 as int) <= (select max(yyyymm) from tmp.tmp_dm_zk_ec_sales)\n",
") t\n",
"group by yyyymm,\n",
"iqvia_pack_code,\n",
"corp_cod,\n",
"audit_cod,\n",
"platform,\n",
"store_type,\n",
"store_name,\n",
"DATA_SOURCE"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557246541,
"inputWidgets": {},
"nuid": "ebb41c4f-a6d7-4dbd-bdb1-304f0c5abae4",
"showTitle": false,
"startTime": 1778557241789,
"submitTime": 1778557188277,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"insert overwrite table dws.dws_zk_ec_pack_property \n",
"select \n",
" * \n",
" ,from_utc_timestamp(current_timestamp(),'UTC+8' ) etl_insert_dt\n",
" ,from_utc_timestamp(current_timestamp(),'UTC+8' ) etl_update_dt\n",
"from tmp.tmp_ec_temp_market\n",
"union all\n",
"select\n",
"'' iqvia_lineno\n",
",iqvia_pack_code as iqvia_pack_code\n",
",'' prod_cod\n",
",'' iqvia_notes\n",
",'' new_pack_flag\n",
",'' is_exists_chpa\n",
",iqvia_pack_code as product_id\n",
",'' prescription_nature\n",
",'' medicine_type\n",
",'' zk_medicine_tier1\n",
",'' zk_medicine_tier2\n",
",'' zk_medicine_tier3\n",
",'' zk_medicine_tier4\n",
",'' common_name\n",
",'' dosage_form\n",
",'' user_type\n",
",'' category_name\n",
",'' product_name\n",
",'' brand_name\n",
",'' zk_manu_des\n",
",'' zk_corp_des\n",
",'' zk_pack_des\n",
",'' counting_unit_a\n",
",'' dosage_unit_a\n",
",'' unit_a\n",
",'' app1_cod\n",
",'' app1_des\n",
",'' app1_des_c\n",
",'' app2_cod\n",
",'' app2_des\n",
",'' app2_des_c\n",
",'' app3_cod\n",
",'' app3_des\n",
",'' app3_des_c\n",
",'' atc1_cod\n",
",'' atc1_des\n",
",'' atc1_des_c\n",
",'' atc2_cod\n",
",'' atc2_des\n",
",'' atc2_des_c\n",
",'' atc3_cod\n",
",'' atc3_des\n",
",'' atc3_des_c\n",
",'' atc4_cod\n",
",'' atc4_des\n",
",'' atc4_des_c\n",
",'' bio_desc\n",
",'' cmps_cod\n",
",'' cmps_des\n",
",'' cmps_des_c\n",
",corp_cod as corp_cod\n",
",'' corp_des\n",
",'' corp_des_c\n",
",'' edl_desc\n",
",'' eth_otc_desc\n",
",'' gene_orig_desc\n",
",'' gqce_desc\n",
",'' manu_cod\n",
",'' manu_des\n",
",'' manu_des_c\n",
",'' mnfl_cod\n",
",'' mnfl_des\n",
",'' nrdl_desc\n",
",'' pack_des\n",
",'' stgh_des\n",
",'' pack_lch\n",
",'' paed_desc\n",
",'Others' prod_des\n",
",'Others' prod_des_c\n",
",'' tcm_desc\n",
",'' vbp_desc\n",
",'' unit\n",
",'' counting_unit\n",
",'' dosage_unit\n",
",'' NRDL_ENTRY_DATE\n",
",'ALL Market' Market\n",
",'' bu\n",
",1 extend_market_ratio\n",
",case when iqvia_pack_code like '%AZ%' then 'Y' else 'N' end is_az\n",
",from_utc_timestamp(current_timestamp(),'UTC+8' ) etl_insert_dt\n",
",from_utc_timestamp(current_timestamp(),'UTC+8' ) etl_update_dt\n",
"from (select distinct iqvia_pack_code,corp_cod from dm.dm_zk_ec_sales where iqvia_pack_code not in (select distinct iqvia_pack_code from tmp.tmp_ec_temp_market))\n"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557250987,
"inputWidgets": {},
"nuid": "25bd255c-597c-4bb0-9c7a-0577e28eefee",
"showTitle": false,
"startTime": 1778557246546,
"submitTime": 1778557188283,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"insert overwrite table tmp.tmp_dm_zk_ec_pack_property \n",
"select \n",
"a.iqvia_lineno\n",
",a.iqvia_pack_code\n",
",a.prod_cod\n",
",a.iqvia_notes\n",
",a.new_pack_flag\n",
",a.is_exists_chpa\n",
",a.product_id\n",
",a.prescription_nature\n",
",a.medicine_type\n",
",a.zk_medicine_tier1\n",
",a.zk_medicine_tier2\n",
",a.zk_medicine_tier3\n",
",a.zk_medicine_tier4\n",
",a.common_name\n",
",a.dosage_form\n",
",a.user_type\n",
",a.category_name\n",
",a.product_name\n",
",a.brand_name\n",
",a.zk_manu_des\n",
",a.zk_corp_des\n",
",a.zk_pack_des\n",
",a.counting_unit_a\n",
",a.dosage_unit_a\n",
",a.unit_a\n",
",a.app1_cod\n",
",a.app1_des\n",
",a.app1_des_c\n",
",a.app2_cod\n",
",a.app2_des\n",
",a.app2_des_c\n",
",a.app3_cod\n",
",a.app3_des\n",
",a.app3_des_c\n",
",a.atc1_cod\n",
",a.atc1_des\n",
",a.atc1_des_c\n",
",a.atc2_cod\n",
",a.atc2_des\n",
",a.atc2_des_c\n",
",a.atc3_cod\n",
",a.atc3_des\n",
",a.atc3_des_c\n",
",a.atc4_cod\n",
",a.atc4_des\n",
",a.atc4_des_c\n",
",a.bio_desc\n",
",a.cmps_cod\n",
",a.cmps_des\n",
",a.cmps_des_c\n",
",COALESCE(c.corp_cod,b.corp_cod,a.corp_cod) corp_cod\n",
",COALESCE(c.corp_des,b.corp_des,a.corp_des) corp_des\n",
",COALESCE(d.corp_des_c,a.corp_des_c ) corp_des_c\n",
",a.edl_desc\n",
",a.eth_otc_desc\n",
",a.gene_orig_desc\n",
",a.gqce_desc\n",
",COALESCE(c.manu_cod,b.manu_cod,a.manu_cod) manu_cod \n",
",COALESCE(c.manu_des,b.manu_des,a.manu_des) manu_des \n",
",COALESCE(e.manu_des_c,a.manu_des_c) manu_des_c\n",
",a.mnfl_cod\n",
",a.mnfl_des\n",
",a.nrdl_desc\n",
",a.pack_des\n",
",a.stgh_des\n",
",a.pack_lch\n",
",a.paed_desc\n",
",a.prod_des\n",
",a.prod_des_c\n",
",a.tcm_desc\n",
",a.vbp_desc\n",
",a.unit\n",
",a.counting_unit\n",
",a.dosage_unit\n",
",a.NRDL_ENTRY_DATE\n",
",a.Market\n",
",a.bu\n",
",a.extend_market_ratio\n",
",a.is_az\n",
"from dws.dws_zk_ec_pack_property a \n",
"left join (select right(concat('000000000',prod_cod ),9) prod_cod,corp_cod,corp_des,manu_cod,manu_des from dwd.dwd_gnd_tbl_corp_change where pack_cod is null ) b \n",
"on right(concat('000000000',A.prod_cod ),9)= b.prod_cod\n",
"left join (select if( pack_cod REGEXP '^[0-9]',right(concat('000000000000',pack_cod),12),pack_cod) pack_cod,corp_cod,corp_des,manu_cod,manu_des from dwd.dwd_gnd_tbl_corp_change where pack_cod is not null ) c \n",
"on a.iqvia_pack_code = c.pack_cod\n",
"left join (select distinct corp_cod,corp_des_c from dwd.dwd_gnd_ext_retail_pack_property) d \n",
"on coalesce(C.corp_cod,B.corp_cod ) = d.corp_cod \n",
"Left join (select distinct manu_cod,manu_des,manu_des_c from dwd.dwd_gnd_ext_retail_pack_property) e \n",
"On coalesce(C.manu_cod,B.manu_cod ) = e.manu_cod "
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557268253,
"inputWidgets": {},
"nuid": "d13a4ab2-9a37-4ac4-a886-3cf57cc9d41a",
"showTitle": false,
"startTime": 1778557250991,
"submitTime": 1778557188292,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"------将事实表倒减之后的维度信息补充到维度表里\n",
"insert overwrite table dm.dm_zk_ec_pack_property \n",
"select \n",
" CASE when a.iqvia_pack_code IN ('CVRM_AZ_OTHERS','CVRM_OTHERS') THEN 'CVRM_OTHER Market'\n",
" WHEN a.iqvia_pack_code IN ('CV_AZ_OTHERS','CV_OTHERS') THEN 'CV_OTHER Market' \n",
" WHEN A.iqvia_pack_code IN ('OTHERS_AZ_TA','OTHERS_TA') THEN 'OTHERS Market'\n",
" ELSE a.market \n",
" END ||'_'||a.iqvia_pack_code MARKET_PACK_KEY \n",
",a.iqvia_lineno\n",
",a.iqvia_pack_code\n",
",a.prod_cod\n",
",a.iqvia_notes\n",
",a.new_pack_flag\n",
",a.is_exists_chpa\n",
",'' Family_Code \n",
",'' Family_Name \n",
",'' BrandType\n",
",'' AZ_MAIN \n",
",'' AZ_Related\n",
",t5.KEY_COMPETITOR\n",
",a.product_id\n",
",a.prescription_nature\n",
",a.medicine_type\n",
",a.zk_medicine_tier1\n",
",a.zk_medicine_tier2\n",
",a.zk_medicine_tier3\n",
",a.zk_medicine_tier4\n",
",a.common_name\n",
",a.dosage_form\n",
",a.user_type\n",
",a.category_name\n",
",a.product_name\n",
",a.brand_name\n",
",a.zk_manu_des\n",
",a.zk_corp_des\n",
",a.zk_pack_des\n",
",a.counting_unit_a\n",
",a.dosage_unit_a\n",
",a.unit_a\n",
",a.app1_cod\n",
",a.app1_des\n",
",a.app1_des_c\n",
",a.app2_cod\n",
",a.app2_des\n",
",a.app2_des_c\n",
",a.app3_cod\n",
",a.app3_des\n",
",a.app3_des_c\n",
",a.atc1_cod\n",
",a.atc1_des\n",
",a.atc1_des_c\n",
",a.atc2_cod\n",
",a.atc2_des\n",
",a.atc2_des_c\n",
",a.atc3_cod\n",
",a.atc3_des\n",
",a.atc3_des_c\n",
",a.atc4_cod\n",
",a.atc4_des\n",
",a.atc4_des_c\n",
",a.bio_desc\n",
",a.cmps_cod\n",
",a.cmps_des\n",
",a.cmps_des_c\n",
",CASE WHEN a.iqvia_pack_code LIKE '%AZ%' THEN 'A5Z' else a.CORP_COD END \n",
"\t\t\t\t\t\t\t\tcorp_cod \n",
",CASE \n",
"\tWHEN a.iqvia_pack_code LIKE '%AZ%' THEN 'ASTRAZENECA' \n",
"\tWHEN a.corp_des like '%GROUP%' THEN replace(a.corp_des,' GROUP','')\n",
"\telse a.CORP_DES END corp_des \n",
",CASE WHEN a.iqvia_pack_code LIKE '%AZ%' THEN '阿斯利康制药集团' else a.CORP_DES_C END \n",
" CORP_DES_C\n",
",a.edl_desc\n",
",a.eth_otc_desc\n",
",a.gene_orig_desc\n",
",a.gqce_desc\n",
",a.manu_cod\n",
",a.manu_des\n",
",a.manu_des_c\n",
",a.mnfl_cod\n",
",a.mnfl_des\n",
",a.nrdl_desc\n",
",a.pack_des\n",
",a.stgh_des\n",
",a.pack_lch\n",
",a.paed_desc\n",
",a.prod_des\n",
",a.prod_des_c\n",
",a.tcm_desc\n",
",a.vbp_desc\n",
",a.unit\n",
",a.counting_unit\n",
",a.dosage_unit\n",
",a.NRDL_ENTRY_DATE\n",
",CASE WHEN a.iqvia_pack_code IN ('CVRM_AZ_OTHERS','CVRM_OTHERS') THEN 'CVRM_OTHER Market'\n",
" WHEN a.iqvia_pack_code IN ('CV_AZ_OTHERS','CV_OTHERS') THEN 'CV_OTHER Market' \n",
" WHEN A.iqvia_pack_code IN ('OTHERS_AZ_TA','OTHERS_TA') THEN 'OTHERS Market'\n",
" ELSE a.market \n",
" END market\n",
",a.bu\n",
",a.extend_market_ratio\n",
",a.is_az\n",
",nvl(b.class, 'Others') class\n",
",CASE WHEN a.iqvia_pack_code IN ('CVRM_AZ_OTHERS','CVRM_OTHERS') THEN 'CVRM'\n",
" WHEN a.iqvia_pack_code IN ('CV_AZ_OTHERS','CV_OTHERS') THEN 'CV' \n",
" ELSE c.ta \n",
" END TA \n",
"from tmp.tmp_dm_zk_ec_pack_property a \n",
"left join dwd.dwd_gnd_ext_retail_dim_ta c \n",
"on c.market = a.Market \n",
"left join dwd.dwd_gnd_tblclass b \n",
"on a.Market = case when b.market is null then a.Market else b.market end\n",
"and nvl(a.iqvia_pack_code,'') = case when b.pack_code is null then nvl(a.iqvia_pack_code,'') else b.pack_code end\n",
"and nvl(a.prod_cod,'') = case when b.product_code is null then nvl(a.prod_cod,'') else b.product_code end\n",
"and nvl(a.cmps_cod,'') = case when b.molecule_code is null then nvl(a.cmps_cod,'') else right(concat('000000',b.molecule_code),6) end\n",
"and nvl(a.corp_cod,'') = case when b.corporation_code is null then nvl(a.corp_cod,'') else b.corporation_code end\n",
"and nvl(a.manu_cod,'') = case when b.manufacturer_code is null then nvl(a.manu_cod,'') else b.manufacturer_code end\n",
"and nvl(a.app1_cod,'') = case when b.nfc1_code is null then nvl(a.app1_cod,'') else b.nfc1_code end\n",
"and nvl(a.app2_cod,'') = case when b.nfc2_code is null then nvl(a.app2_cod,'') else b.nfc2_code end\n",
"and nvl(a.app3_cod,'') = case when b.nfc3_code is null then nvl(a.app3_cod,'') else b.nfc3_code end\n",
"and nvl(a.atc1_cod,'') = case when b.atc1_code is null then nvl(a.atc1_cod,'') else b.atc1_code end\n",
"and nvl(a.atc2_cod,'') = case when b.atc2_code is null then nvl(a.atc2_cod,'') else b.atc2_code end\n",
"and nvl(a.atc3_cod,'') = case when b.atc3_code is null then nvl(a.atc3_cod,'') else b.atc3_code end \n",
"and nvl(a.atc4_cod,'') = case when b.atc4_code is null then nvl(a.atc4_cod,'') else b.atc4_code end\n",
"and nvl(a.stgh_des,'') = case when b.strength is null then nvl(a.stgh_des,'') else b.strength end\n",
"left join (select distinct MARKET,PACK_CODE as PACK_COD,KEY_COMPETITOR from DM.DM_TD_EXT_CHPA_MARKET_PACK_MAPPING) t5\n",
"on a.market = t5.MARKET\n",
"and a.iqvia_pack_code = t5.PACK_COD\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557271279,
"inputWidgets": {},
"nuid": "8c861c10-773a-4449-a5dc-c0340e5ec97e",
"showTitle": false,
"startTime": 1778557268257,
"submitTime": 1778557188299,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"insert overwrite table dm.dm_zk_ec_market_property \n",
"select distinct \n",
"iqvia_pack_code,market,ta\n",
"from dm.dm_zk_ec_pack_property "
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557275535,
"inputWidgets": {},
"nuid": "e39d8c66-7469-46db-a2f4-79976266bec2",
"showTitle": false,
"startTime": 1778557271284,
"submitTime": 1778557188306,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"insert overwrite table dm.dm_zk_ec_market_ratio \n",
"select distinct\n",
" concat(a.Market,'_',a.iqvia_pack_code) as market_pack_key,\n",
" a.iqvia_pack_code as pack_cod,\n",
" a.prod_des,\n",
" a.cmps_des,\n",
" a.corp_cod,\n",
" a.Market,\n",
" a.extend_market_ratio as value_market_ratio,\n",
" a.extend_market_ratio as unit_market_ratio,\n",
" coalesce(\n",
" case when c.ratio is null then a.extend_market_ratio*d.ratio\n",
" else a.extend_market_ratio*c.ratio end,1) as countingunit_market_ratio\n",
"from tmp.tmp_ec_temp_market a \n",
"left join (--pack\n",
" select\n",
"\t\tmarket,\n",
"\t\tcmps_cod,\n",
"\t\tcmps_des,\n",
"\t\tif( pack_cod REGEXP '^[0-9]',right(concat('000000000000',pack_cod),12),pack_cod) pack_cod,--right(concat('0000000',pack_cod ),7)\n",
"\t\tpack_des,\n",
"\t\tlevel,\n",
"\t\ttype,\n",
"\t\tcast(ratio as float) as ratio,\n",
"\t\tcast(starttime as int) starttime,\n",
"\t\tcast (endtime as int) endtime\n",
" from dwd.dwd_gnd_ims_tblbrandratio\n",
" where UPPER(TYPE) = 'COUNTINGUNIT' and UPPER(Level) = 'PACK'\n",
")c on a.Market = c.market and a.iqvia_pack_code = if( c.pack_cod REGEXP '^[0-9]',right(concat('000000000000',c.pack_cod),12),c.pack_cod)--right(concat('0000000',c.pack_cod),7)\n",
"left join(--molecule\n",
" select\n",
"\t\tmarket,\n",
"\t\tcmps_cod,\n",
"\t\tcmps_des,\n",
"\t\tif( pack_cod REGEXP '^[0-9]',right(concat('000000000000',pack_cod),12),pack_cod) pack_cod,--right(concat('0000000',pack_cod ),7)\n",
"\t\tpack_des,\n",
"\t\tlevel,\n",
"\t\ttype,\n",
"\t\tcast(ratio as float) as ratio,\n",
"\t\tcast(starttime as int) starttime,\n",
"\t\tcast (endtime as int) endtime\n",
" from dwd.dwd_gnd_ims_tblbrandratio\n",
" where UPPER(TYPE) = 'COUNTINGUNIT' and UPPER(Level) = 'MOLECULE'\n",
")d on a.Market = d.market and a.cmps_cod = right(concat('000000',d.cmps_cod ),6)"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557278550,
"inputWidgets": {},
"nuid": "bbe40a04-e787-4133-9901-5f331baf912a",
"showTitle": false,
"startTime": 1778557275539,
"submitTime": 1778557188311,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"create or replace table dm.dm_zk_ec_geo\n",
"using delta as\n",
"select\n",
" 'ROC' as audit_cod,\n",
" '全国' as city_c,\n",
" 'national' as city_e,\n",
" '全国' as province_c,\n",
" 'national' as province_e;"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557278560,
"inputWidgets": {},
"nuid": "f8d0befe-3de4-48a8-ac53-cdc19c897d0f",
"showTitle": false,
"startTime": 1778557278555,
"submitTime": 1778557188317,
"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",
"-- 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",
"-- -- ────────────────────────────────────────────────────────────\n",
"-- -- CTE 2B2C 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 3TA 概览数据(当期 + 去年同期一次性关联)\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",
"-- UNION ALL\n",
"\n",
"-- -- ════════════════════════════════════════════════════════════\n",
"-- -- KPI 2Top1 品牌增长率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",
"\n",
"-- -- ════════════════════════════════════════════════════════════\n",
"-- -- KPI 3Top1 品牌销售额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",
"\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",
"\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",
"\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",
"\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;"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557283201,
"inputWidgets": {},
"nuid": "9e6100db-d97c-41a6-8b30-4f7a774c1903",
"showTitle": false,
"startTime": 1778557278565,
"submitTime": 1778557188322,
"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": 1778557285684,
"inputWidgets": {},
"nuid": "0c0fe2ec-f80e-4872-85bf-fd5d058cc8b8",
"showTitle": false,
"startTime": 1778557283205,
"submitTime": 1778557188328,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-- ============================================================\n",
"-- 目标表dm.dm_zk_ec_sales_kpi\n",
"-- 功能:从 KPI 临时宽表清洗入 DM 层\n",
"-- 处理CORP_COD 合并 / 时间字段标准化 / 店铺类型映射 / TA 映射\n",
"-- ============================================================\n",
"INSERT OVERWRITE TABLE dm.dm_zk_ec_sales_kpi\n",
"SELECT\n",
"\n",
" -- CORP_COD汇总行total_flag = Y统一写 'TTL MKT',否则取企业编码\n",
" CASE WHEN TA = 'RX Total' and total_flag = 'Y' THEN ''\n",
" WHEN total_flag = 'Y' THEN 'TTL MKT'\n",
" ELSE NVL(CORP_COD, '未知')\n",
" END AS CORP_COD,\n",
"\n",
" -- 时间维度yyyymm 优先,为空则降级取 ytd\n",
" -- 两者皆空时输出空字符串\n",
" NVL(NULLIF(yyyymm, ''), NVL(ytd, '')) AS yyyymm,\n",
"\n",
" -- YTD 标记ytd 有值则为 Y否则为 N\n",
" IF(ytd <> '', 'Y', 'N') AS ytd,\n",
"\n",
" NVL(platform, '') AS platform,\n",
"\n",
" -- 店铺类型标准化:自营旗舰 → SO第三方 → POP其余保留原值\n",
" CASE WHEN store_type = '自营旗舰' THEN 'SO'\n",
" WHEN store_type = '第三方' THEN 'POP'\n",
" ELSE NVL(store_type, '')\n",
" END AS store_type,\n",
"\n",
" NVL(geo_key, '') AS geo_key,\n",
" NVL(KPI_name, '') AS KPI_name,\n",
"\n",
" -- 数值型 KPI先转 DOUBLE 再 NVL兼容源字段为字符串的情况\n",
" nvl(CAST(Kpi_val AS decimal(30,10)),0) AS Kpi_val,\n",
" nvl(CAST(Kpi_val_ly AS decimal(30,10)),0) AS Kpi_val_ly,\n",
"\n",
" -- 字符串型 KPI销售额/销量,含同比)\n",
" NVL(str_kpi_val, '') AS str_kpi_val,\n",
" NVL(str_kpi_val_ly, '') AS str_kpi_val_ly,\n",
" NVL(str_kpi_vol, '') AS str_kpi_vol,\n",
" NVL(str_kpi_vol_ly, '') AS str_kpi_vol_ly,\n",
"\n",
" NVL(total_flag, '') AS total_flag,\n",
"\n",
" -- TA 映射NIAD → DMRX Total → 空,其余保留原值\n",
" CASE WHEN ta = 'NIAD' THEN 'DM'\n",
" WHEN ta = 'RX Total' THEN ''\n",
" ELSE NVL(ta, '')\n",
" END AS ta\n",
"\n",
"FROM tmp.tmp_zk_ec_sales_kpi_tmp;"
]
},
{
"cell_type": "markdown",
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"inputWidgets": {},
"nuid": "dc2bbed1-223b-4610-a55f-334e63050e68",
"showTitle": false,
"tableResultSettingsMap": {},
"title": ""
}
},
"source": [
"## NIAD Date"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557292166,
"inputWidgets": {},
"nuid": "6b591466-5af8-40ef-a9b9-c4f137843f18",
"showTitle": false,
"startTime": 1778557285688,
"submitTime": 1778557188343,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"-- 计算NIAD的时间是否比其他数据源先来数据 chenwu\n",
"CREATE OR REPLACE TABLE tmp.tmp_dm_td_ext_ec_niad_month as\n",
"WITH all_ec_data (\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_hm_jd_2025before\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_hm_jd_2025after\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_hm_tm_2206after\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_hm_tm_2206before\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_gastritis_23after\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_gastritis_23before\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_re\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_dm_statins_xzk\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_dm_23before\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_dm_23after\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NOTNIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_hm_tm_2403after\n",
" UNION ALL\n",
" SELECT\n",
" MAX(TIME) month,\n",
" 'NIAD' AS DATATYPE\n",
" FROM\n",
" dwd.dwd_gnd_ec_zkb2c_dm_26after\n",
")\n",
"SELECT\n",
" MAX(t1.month) as NIAD_MONTH,\n",
" max(t2.month) OTHERS_MONTH\n",
"FROM\n",
" all_ec_data t1\n",
" LEFT JOIN (\n",
" SELECT\n",
" MAX(month) as month\n",
" FROM\n",
" all_ec_data\n",
" WHERE\n",
" datatype = 'NOTNIAD'\n",
" ) t2\n",
"WHERE\n",
" t1.datatype = 'NIAD'"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"application/vnd.databricks.v1+cell": {
"cellMetadata": {
"byteLimit": 2048000,
"rowLimit": 10000
},
"finishTime": 1778557292715,
"inputWidgets": {},
"nuid": "20f3c0a6-f626-4e64-bce4-7653087adb16",
"showTitle": false,
"startTime": 1778557292171,
"submitTime": 1778557188353,
"tableResultSettingsMap": {},
"title": ""
}
},
"outputs": [],
"source": [
"select * from tmp.tmp_dm_td_ext_ec_niad_month"
]
}
],
"metadata": {
"application/vnd.databricks.v1+notebook": {
"computePreferences": null,
"dashboards": [],
"environmentMetadata": null,
"inputWidgetPreferences": null,
"language": "sql",
"notebookMetadata": {
"pythonIndentUnit": 4
},
"notebookName": "03 ec_load_data",
"widgets": {}
},
"language_info": {
"name": "sql"
}
},
"nbformat": 4,
"nbformat_minor": 0
}