微信小程序页面迁移校验之前 P5任务处理之前
This commit is contained in:
103
scripts/ops/_daily_revenue_0305.py
Normal file
103
scripts/ops/_daily_revenue_0305.py
Normal file
@@ -0,0 +1,103 @@
|
||||
"""统计 2026-03-05 营业日经营数据"""
|
||||
import os, sys
|
||||
from pathlib import Path
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv(Path(__file__).resolve().parents[2] / ".env")
|
||||
|
||||
dsn = os.environ.get("TEST_DB_DSN")
|
||||
if not dsn:
|
||||
dsn = os.environ.get("PG_DSN", "")
|
||||
if "etl_feiqiu" in dsn:
|
||||
dsn = dsn.replace("etl_feiqiu", "test_etl_feiqiu")
|
||||
if not dsn:
|
||||
sys.exit("ERROR: TEST_DB_DSN / PG_DSN not set")
|
||||
|
||||
import psycopg2
|
||||
conn = psycopg2.connect(dsn)
|
||||
cur = conn.cursor()
|
||||
|
||||
sql = """
|
||||
WITH day_label AS (
|
||||
SELECT '3月5日' AS day_name,
|
||||
'2026-03-05 08:00:00+08'::timestamptz AS day_start,
|
||||
'2026-03-06 08:00:00+08'::timestamptz AS day_end
|
||||
),
|
||||
cash_online AS (
|
||||
SELECT dl.day_name, dl.day_start,
|
||||
COALESCE(SUM(h.pay_amount), 0) AS v
|
||||
FROM day_label dl
|
||||
LEFT JOIN dwd.dwd_settlement_head h
|
||||
ON h.create_time >= dl.day_start AND h.create_time < dl.day_end
|
||||
AND h.settle_type = 1
|
||||
GROUP BY dl.day_name, dl.day_start
|
||||
),
|
||||
recharge AS (
|
||||
SELECT dl.day_name, dl.day_start,
|
||||
COALESCE(SUM(ro.pay_amount), 0) AS v
|
||||
FROM day_label dl
|
||||
LEFT JOIN dwd.dwd_recharge_order ro
|
||||
ON ro.create_time >= dl.day_start AND ro.create_time < dl.day_end
|
||||
AND ro.settle_type = 5
|
||||
GROUP BY dl.day_name, dl.day_start
|
||||
),
|
||||
groupbuy AS (
|
||||
SELECT dl.day_name, dl.day_start,
|
||||
COALESCE(SUM(pcr.sale_price * 0.75), 0) AS v
|
||||
FROM day_label dl
|
||||
LEFT JOIN dwd.dwd_platform_coupon_redemption pcr
|
||||
ON pcr.create_time >= dl.day_start AND pcr.create_time < dl.day_end
|
||||
AND pcr.is_delete = 0
|
||||
GROUP BY dl.day_name, dl.day_start
|
||||
),
|
||||
member_guest AS (
|
||||
SELECT dl.day_name, dl.day_start,
|
||||
COUNT(*) FILTER (WHERE h.member_id > 0) AS member_v,
|
||||
COUNT(*) FILTER (WHERE h.member_id = 0) AS guest_v
|
||||
FROM day_label dl
|
||||
LEFT JOIN dwd.dwd_settlement_head h
|
||||
ON h.create_time >= dl.day_start AND h.create_time < dl.day_end
|
||||
AND h.settle_type = 1
|
||||
GROUP BY dl.day_name, dl.day_start
|
||||
),
|
||||
new_member AS (
|
||||
SELECT dl.day_name, dl.day_start,
|
||||
COUNT(DISTINCT m.member_id) AS v
|
||||
FROM day_label dl
|
||||
LEFT JOIN dwd.dim_member m
|
||||
ON m.create_time >= dl.day_start AND m.create_time < dl.day_end
|
||||
AND m.scd2_is_current = 1
|
||||
GROUP BY dl.day_name, dl.day_start
|
||||
),
|
||||
old_recharge AS (
|
||||
SELECT dl.day_name, dl.day_start,
|
||||
COUNT(DISTINCT ro.member_id) FILTER (WHERE ro.member_id > 0) AS persons,
|
||||
COALESCE(SUM(ro.pay_amount) FILTER (WHERE ro.member_id > 0), 0) AS amount
|
||||
FROM day_label dl
|
||||
LEFT JOIN dwd.dwd_recharge_order ro
|
||||
ON ro.create_time >= dl.day_start AND ro.create_time < dl.day_end
|
||||
AND ro.settle_type = 5
|
||||
GROUP BY dl.day_name, dl.day_start
|
||||
)
|
||||
SELECT co.day_name,
|
||||
ROUND(co.v + r.v + gb.v, 2) AS total,
|
||||
co.v AS cash_online,
|
||||
r.v AS recharge,
|
||||
ROUND(gb.v, 2) AS groupbuy,
|
||||
mg.member_v, mg.guest_v,
|
||||
nm.v AS new_members,
|
||||
omr.persons AS old_recharge_persons,
|
||||
omr.amount AS old_recharge_amount
|
||||
FROM cash_online co
|
||||
JOIN recharge r USING (day_name, day_start)
|
||||
JOIN groupbuy gb USING (day_name, day_start)
|
||||
JOIN member_guest mg USING (day_name, day_start)
|
||||
JOIN new_member nm USING (day_name, day_start)
|
||||
JOIN old_recharge omr USING (day_name, day_start);
|
||||
"""
|
||||
|
||||
cur.execute(sql)
|
||||
row = cur.fetchone()
|
||||
cols = [d[0] for d in cur.description]
|
||||
print(dict(zip(cols, row)))
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user