super_vault_stats.sql 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. -- ============================================================
  2. -- 超级仓库 SuperVault · 已售统计 SQL(自营·全站累计口径)
  3. -- 日期:2026/08/14
  4. -- 数据源:super_vault_product_record / super_vault_report_record
  5. -- 统计口径:
  6. -- 0) 统计范围 = sold_count>0 且 status NOT IN (0,1,2,3)(剔除未开卖与未开始/预售/进行中等未成交态,
  7. -- 只留 status 4/6/7/8/9/10/12 等有效成交态)。
  8. -- —— 平台为自营,全站视为一个商家;用「主播 anchor」作二级拆分维度。
  9. -- —— 主播按 anchor_username 分组:同名不同 anchor_id(如两个「北京小周」)合并为一位主播。
  10. -- 1) 销售额 = SUM(sign_price * count) —— 单价×总份数=满仓总价(随机卡种/未售罄团会高于实收 total_price)
  11. -- 2) 成团数 = 拼团商品数(sold_count>0 且 status NOT IN(0,1,2,3))
  12. -- 3) 参与人数 = 拆卡报告 user_name 去重(中卡用户近似,仅覆盖有报告的商品)
  13. -- 4) 均拼单价 = 销售额 / 成团数
  14. -- 5) 人均消费 = 销售额 / 参与人数
  15. -- 6) 成交时间 = COALESCE(completion_time, sold_time, sell_time):完成→售罄成交→开售 依次兜底
  16. -- —— 若只统计某段时间:给主查询与子查询都加成交锚点过滤,例如
  17. -- AND COALESCE(p.completion_time, p.sold_time, p.sell_time)
  18. -- BETWEEN '2026-08-01 00:00:00' AND '2026-09-01 00:00:00'
  19. -- (两段 SELECT 各自独立,可在 Navicat 单独选中执行)
  20. -- ============================================================
  21. -- ------------------------------------------------------------
  22. -- 一、平台大盘(自营·全站累计)
  23. -- ------------------------------------------------------------
  24. SELECT
  25. -- 销售额(元)= 单价×总份数
  26. ROUND(SUM(p.sign_price * p.count), 2) AS 销售额,
  27. -- 主播数(按主播名去重,合并同名)
  28. COUNT(DISTINCT p.anchor_username) AS 主播数,
  29. -- 成团数
  30. COUNT(*) AS 成团数,
  31. -- 均拼单价(销售额 / 成团数)
  32. ROUND(SUM(p.sign_price * p.count) / NULLIF(COUNT(*), 0), 2) AS 均拼单价,
  33. -- 参与人数(拆卡报告中卡用户昵称去重)
  34. (SELECT COUNT(DISTINCT rr.user_name)
  35. FROM super_vault_report_record rr
  36. JOIN super_vault_product_record pp ON pp.pid = rr.pid
  37. WHERE pp.sold_count > 0 AND pp.status NOT IN (0, 1, 2, 3)
  38. AND rr.user_name IS NOT NULL AND rr.user_name <> '') AS 参与人数,
  39. -- 人均消费(销售额 / 参与人数)
  40. ROUND(
  41. SUM(p.sign_price * p.count) /
  42. NULLIF((SELECT COUNT(DISTINCT rr.user_name)
  43. FROM super_vault_report_record rr
  44. JOIN super_vault_product_record pp ON pp.pid = rr.pid
  45. WHERE pp.sold_count > 0 AND pp.status NOT IN (0, 1, 2, 3)
  46. AND rr.user_name IS NOT NULL AND rr.user_name <> ''), 0),
  47. 2
  48. ) AS 人均消费
  49. FROM super_vault_product_record p
  50. WHERE p.sold_count > 0 AND p.status NOT IN (0, 1, 2, 3);
  51. -- ------------------------------------------------------------
  52. -- 二、各主播汇总(按主播名分组·合并同名,按销售额倒序)
  53. -- ------------------------------------------------------------
  54. SELECT
  55. p.anchor_username AS 主播名,
  56. -- 销售额 = 单价×总份数
  57. ROUND(SUM(p.sign_price * p.count), 2) AS 销售额,
  58. -- 成团数
  59. COUNT(*) AS 成团数,
  60. -- 参与人数(该主播商品拆卡报告中卡用户去重)
  61. (SELECT COUNT(DISTINCT rr.user_name)
  62. FROM super_vault_report_record rr
  63. JOIN super_vault_product_record pp ON pp.pid = rr.pid
  64. WHERE pp.anchor_username = p.anchor_username
  65. AND pp.sold_count > 0 AND pp.status NOT IN (0, 1, 2, 3)
  66. AND rr.user_name IS NOT NULL AND rr.user_name <> '') AS 参与人数,
  67. -- 均拼单价
  68. ROUND(SUM(p.sign_price * p.count) / NULLIF(COUNT(*), 0), 2) AS 均拼单价,
  69. -- 人均消费
  70. ROUND(
  71. SUM(p.sign_price * p.count) /
  72. NULLIF((SELECT COUNT(DISTINCT rr.user_name)
  73. FROM super_vault_report_record rr
  74. JOIN super_vault_product_record pp ON pp.pid = rr.pid
  75. WHERE pp.anchor_username = p.anchor_username
  76. AND pp.sold_count > 0 AND pp.status NOT IN (0, 1, 2, 3)
  77. AND rr.user_name IS NOT NULL AND rr.user_name <> ''), 0),
  78. 2
  79. ) AS 人均消费
  80. FROM super_vault_product_record p
  81. WHERE p.sold_count > 0 AND p.status NOT IN (0, 1, 2, 3)
  82. GROUP BY p.anchor_username
  83. ORDER BY 销售额 DESC;
  84. -- ------------------------------------------------------------
  85. -- 三、单个主播每条组队明细(把主播名换成具体主播,如 '郑宇航',按总金额倒序)
  86. -- 参与人数(本团) = 该团拆卡报告 user_name 去重
  87. -- ------------------------------------------------------------
  88. SELECT
  89. p.title AS 团名,
  90. p.serial AS 编号,
  91. p.type_name AS 卡种,
  92. p.standard_name AS 规格,
  93. p.sign_price AS 单价,
  94. p.count AS 总份数,
  95. ROUND(p.sold_count / NULLIF(p.count, 0) * 100, 1) AS 进度百分比,
  96. ROUND(p.sign_price * p.count, 2) AS 总金额,
  97. (SELECT COUNT(DISTINCT rr.user_name) FROM super_vault_report_record rr
  98. WHERE rr.pid = p.pid AND rr.user_name IS NOT NULL AND rr.user_name <> '') AS 参与人数,
  99. p.sell_time AS 开售时间,
  100. -- 成交时间 = 完成时间(发货完成态才有) → 售罄成交时刻 sold_time → 依次兜底
  101. COALESCE(p.completion_time, p.sold_time) AS 成交时间,
  102. TIMESTAMPDIFF(SECOND, p.sell_time, COALESCE(p.completion_time, p.sold_time)) AS 售卖时长秒
  103. FROM super_vault_product_record p
  104. WHERE p.sold_count > 0 AND p.status NOT IN (0, 1, 2, 3)
  105. AND p.anchor_username = '郑宇航' -- ← 改这里选主播
  106. ORDER BY 总金额 DESC;