logistics/算账方案.ipynb

189 lines
7.0 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "a13175db",
"metadata": {},
"outputs": [],
"source": [
"BASE_SQL = \"\"\"\n",
"WITH \n",
"odr_list AS ( \n",
" SELECT \n",
" dwd.order_list.order_id,\n",
" dwd.order_list.site_name,\n",
" dwd.order_list.order_date,\n",
" dwd.order_list.delivery_country,\n",
" dwd.order_list.postcode,\n",
" dwd.order_list.currency,\n",
" dwd.order_list.order_price,\n",
" dwd.order_list.order_freight_price,\n",
" dwd.order_list.order_price_dollar,\n",
" dwd.order_list.order_freight_price_dollar,\n",
" dwd.order_list.insurance,\n",
" dwd.order_list.discount_code,\n",
" dwd.order_list.order_cate,\n",
" dwd.order_list.fund_status,\n",
" dwd.order_list.convey \n",
" FROM \n",
" dwd.order_list \n",
" WHERE \n",
" site_name REGEXP \"^litfad|beau|kwowking|lakiq\" \n",
" AND fund_status NOT REGEXP \"等待\" \n",
" AND DATE_FORMAT(order_date,\"%Y-%m-01\") >= \"2025-06-01\"\n",
"),\n",
"\n",
"refund AS (\n",
" SELECT\n",
" ol.order_id,\n",
" SUM(`当次退款USD金额`) AS \"总退款金额\",\n",
" sum(`当次退款申请比例`) AS \"当次退款申请比例\",\n",
" `原订单退款比例`,\n",
" MAX(`申请时间`) AS \"最后一次申请时间\"\n",
" FROM\n",
" dwd.`cpmaso_order_refund` cof\n",
" LEFT JOIN dwd.order_list ol ON ol.order_id = cof.order_id \n",
" WHERE\n",
" 状态 = \"退款成功\" \n",
" AND 网站 REGEXP \"litfad|lakiq|kwoking|beau\" \n",
" AND ol.order_date >= \"2025-01-01\" \n",
" AND EXISTS (\n",
" SELECT 1 FROM odr_list WHERE odr_list.order_id = cof.order_id\n",
" )\n",
" GROUP BY\n",
" ol.order_id\n",
"),\n",
"-- WITH\n",
"sub_order AS (\n",
"SELECT DISTINCT\n",
" opl.order_id,\n",
"\n",
" CASE \n",
" WHEN (LENGTH(opl.order_product_id) - LENGTH(REPLACE(opl.order_product_id, '_', ''))) = 1 THEN opl.order_product_id\n",
" ELSE SUBSTRING_INDEX(opl.order_product_id, '_', 2)\n",
" END AS 子订单号,\n",
"\n",
" CASE \n",
" WHEN (LENGTH(opl.order_product_id) - LENGTH(REPLACE(opl.order_product_id, '_', ''))) = 2 THEN opl.order_product_id\n",
" ELSE NULL\n",
" END AS 子子订单号,\n",
"\n",
" lor.redo_type AS 补发类型\n",
"-- wp.actual_price * wp.buy_num AS 采购金额,\n",
"-- buy_audit\n",
"\n",
"FROM dwd.order_product_list opl \n",
"LEFT JOIN dws.log_order_reissue_detail lord \n",
" ON lord.order_product_id = opl.order_product_id\n",
"LEFT JOIN dwd.log_order_reissue lor \n",
" ON lord.order_product_id = lor.order_product_id\n",
"WHERE DATE_FORMAT(opl.order_date, \"%Y-%m-01\") >= \"2025-06-01\"\n",
"\n",
"),\n",
"sub_order2 AS (\n",
"SELECT\n",
"order_id,\n",
"COUNT(CASE WHEN 子子订单号 IS NULL THEN 1 ELSE NULL END) AS 子订单数,\n",
"COUNT(CASE WHEN 子子订单号 IS NOT NULL THEN 1 ELSE NULL END) AS 子子订单数,\n",
"COUNT(CASE WHEN 子子订单号 IS NOT NULL AND 补发类型 REGEXP \"配件补发|整件补发\" THEN 1 ELSE NULL END) AS 补发订单数,\n",
"COUNT(CASE WHEN 子子订单号 IS NOT NULL AND 补发类型 REGEXP \"换款\" THEN 1 ELSE NULL END) AS 换款订单数,\n",
"COUNT(CASE WHEN 子子订单号 IS NOT NULL AND 补发类型 NOT REGEXP \"换款|配件补发|整件补发\" AND 补发类型 IS NOT NULL THEN 1 ELSE NULL END) AS 其他补发数,\n",
"COUNT(CASE WHEN 子子订单号 IS NOT NULL AND 补发类型 IS NULL THEN 1 ELSE NULL END) AS 拆分订单数\n",
"FROM\n",
"sub_order\n",
"GROUP BY order_id\n",
"),\n",
"\n",
"\n",
"is_shipping AS (\n",
"SELECT\n",
" opl.order_id,\n",
" count(distinct CASE WHEN oe.`关联提单号`<>\"--\" AND oe.`关联提单号`<>\"未关联\" AND oe.`包裹状态` not in ( \"已作废\",\"已删除\") THEN oe.`包裹号` ELSE null END) AS 已发货包裹数,\n",
" COUNT(DISTINCT CASE WHEN oe.`包裹状态` not in ( \"已作废\",\"已删除\",\"--\") THEN oe.`包裹号` ELSE null END)AS 所有包裹数,\n",
" MIN(oe.`客户签收时间`) AS 客户最早签收时间\n",
" FROM order_express oe \n",
" left join dwd.order_product_list opl on oe.`单号` = opl.order_id \n",
" WHERE DATE_FORMAT(opl.order_date,\"%Y-%m-%d\") >'2025-01-01'\n",
" GROUP BY opl.order_id\n",
" \n",
")\n",
"\n",
"SELECT\n",
" ol.*,\n",
" rf.总退款金额,\n",
" 当次退款申请比例,\n",
" 原订单退款比例,\n",
" 最后一次申请时间,\n",
" so.子订单数,\n",
" so.子子订单数,\n",
" so.补发订单数,\n",
" so.换款订单数,\n",
" so.其他补发数,\n",
" so.拆分订单数,\n",
" CASE when sp.已发货包裹数 =sp.所有包裹数 then \"订单已发货\"\n",
" WHEN sp.已发货包裹数 < sp.所有包裹数 THEN \"部分发货\"\n",
" WHEN sp.已发货包裹数 = 0 then\"未发货\" ELSE \"无包裹\" END AS \"订单发货状态\" ,\n",
" sp.客户最早签收时间\n",
"FROM\n",
" odr_list ol\n",
" LEFT JOIN refund rf ON ol.order_id = rf.order_id\n",
" LEFT JOIN sub_order2 so ON ol.order_id = so.order_id\n",
" LEFT JOIN is_shipping sp ON ol.order_id = sp.order_id\"\"\""
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "6b6089e2",
"metadata": {},
"outputs": [],
"source": [
"\n",
"#然后提取这些包裹号的提单ID\n",
"#分析这些提单ID的总价和平均价格\n",
"from utils.gtools import MySQLconnect\n",
"import pandas as pd\n",
"with MySQLconnect('ods') as db:\n",
" engine = db.engine()\n",
" order_df = pd.read_sql(BASE_SQL,engine)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "b9140af6",
"metadata": {},
"outputs": [],
"source": [
"#提取这些订单号的包裹号\n",
"order_id = order_df['order_id'].tolist()\n",
"order_ids = ','.join(f\"'{i}'\" for i in order_id)\n",
"with MySQLconnect('ods') as db:\n",
" conn = db.connect()\n",
" cursor = conn.cursor()\n",
" sql = f\"SELECT * FROM order_info WHERE order_id IN ({order_ids})\""
]
},
{
"cell_type": "markdown",
"id": "5e4096b2",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "base",
"language": "python",
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.11.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}