stats_sold.sql 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. -- ============================================================
  2. -- 得卡 DECA · 已售流程统计 SQL(按 completed_at 统计「昨天17点~今天6点」成交)
  3. -- 日期:2026/08/05
  4. -- 数据源:deca_product_record / deca_report_record
  5. -- 统计口径:
  6. -- 0) 统计范围 = 成交完成时间 completed_at 落在 [昨天 17:00:00, 今天 06:00:00] 的已售商品
  7. -- —— completed_at 为 varchar 存 'YYYY-MM-DD HH:MM:SS',与 datetime 边界直接比较即可
  8. -- —— 起点 (CURDATE() - INTERVAL 1 DAY) + INTERVAL 17 HOUR = 昨天17:00
  9. -- 终点 CURDATE() + INTERVAL 6 HOUR = 今天06:00(含两端)
  10. -- —— 表达式直接内联在每段查询,两段 SELECT 各自独立、可在 Navicat 单独选中执行
  11. -- 1) 销售额 = SUM(sold_count * unit_price)(每商品 已售份数 × 单价 之和)
  12. -- 2) 成团数 = 该时段成交的已售商品数(已售列表返回的都是卖过的,默认都算成团)
  13. -- 3) 参与人数 = 该时段成交商品对应拆卡报告里的中卡用户昵称去重
  14. -- —— 已售接口不返回 buyer 明细,只能用拆卡报告近似,仅覆盖 report_state=1 的商品
  15. -- 4) 均拼单价 = 销售额 / 成团数(单笔团购平均总金额,非 unit_price)
  16. -- 5) 人均消费 = 销售额 / 参与人数
  17. -- 用法:每天跑一次即可(默认取昨天17点~今天6点)。要跑指定日期区间,把两处边界表达式
  18. -- 换成 '2026-08-04 17:00:00' / '2026-08-05 06:00:00' 这样的字面量即可。
  19. -- ============================================================
  20. -- ------------------------------------------------------------
  21. -- 一、平台大盘(昨天成交口径,对应图片 6 个卡片)
  22. -- 参与人数用 deca_report_record.hit_user_nickname 去重
  23. -- —— 只覆盖昨天成交且 report_state=1(已采到报告)的商品
  24. -- ------------------------------------------------------------
  25. SELECT
  26. -- 销售额(元)
  27. ROUND(SUM(p.sold_count * p.unit_price), 2) AS 销售额,
  28. -- 商家数(昨天有成交商品的去重商家)
  29. COUNT(DISTINCT p.merchant_user_id) AS 商家数,
  30. -- 成团数(昨天成交的已售商品数)
  31. COUNT(*) AS 成团,
  32. -- 均拼单价(销售额 / 成团数,单笔团购平均总金额)
  33. ROUND(SUM(p.sold_count * p.unit_price) / NULLIF(COUNT(*), 0), 2) AS 均拼单价,
  34. -- 参与人数(昨天成交商品的拆卡报告中卡用户昵称去重)
  35. (SELECT COUNT(DISTINCT r.hit_user_nickname)
  36. FROM deca_report_record r
  37. JOIN deca_product_record pp ON pp.product_code = r.product_code
  38. WHERE pp.completed_at >= (CURDATE() - INTERVAL 1 DAY) + INTERVAL 17 HOUR AND pp.completed_at <= CURDATE() + INTERVAL 6 HOUR
  39. AND r.hit_user_nickname IS NOT NULL
  40. AND r.hit_user_nickname <> '') AS 参与人数,
  41. -- 人均消费(销售额 / 参与人数)
  42. ROUND(
  43. SUM(p.sold_count * p.unit_price) /
  44. NULLIF((SELECT COUNT(DISTINCT r.hit_user_nickname)
  45. FROM deca_report_record r
  46. JOIN deca_product_record pp ON pp.product_code = r.product_code
  47. WHERE pp.completed_at >= (CURDATE() - INTERVAL 1 DAY) + INTERVAL 17 HOUR AND pp.completed_at <= CURDATE() + INTERVAL 6 HOUR
  48. AND r.hit_user_nickname IS NOT NULL
  49. AND r.hit_user_nickname <> ''), 0),
  50. 2
  51. ) AS 人均消费
  52. FROM deca_product_record p
  53. WHERE p.completed_at >= (CURDATE() - INTERVAL 1 DAY) + INTERVAL 17 HOUR
  54. AND p.completed_at <= CURDATE() + INTERVAL 6 HOUR
  55. AND p.unit_price IS NOT NULL
  56. AND p.sold_count IS NOT NULL;
  57. -- ------------------------------------------------------------
  58. -- 二、指定商家(881226408)昨天成交:销售额/成团数/参与人数
  59. -- ------------------------------------------------------------
  60. SELECT
  61. MAX(p.merchant_name) AS 商家名,
  62. -- 销售额
  63. ROUND(SUM(p.sold_count * p.unit_price), 2) AS 销售额,
  64. -- 成团数(昨天成交)
  65. COUNT(*) AS 成团数,
  66. -- 参与人数(该商家昨天成交且已采报告商品的中卡用户昵称去重)
  67. (SELECT COUNT(DISTINCT r.hit_user_nickname)
  68. FROM deca_report_record r
  69. JOIN deca_product_record pp ON pp.product_code = r.product_code
  70. WHERE pp.merchant_user_id = '881226408'
  71. AND pp.completed_at >= (CURDATE() - INTERVAL 1 DAY) + INTERVAL 17 HOUR AND pp.completed_at <= CURDATE() + INTERVAL 6 HOUR
  72. AND r.hit_user_nickname IS NOT NULL
  73. AND r.hit_user_nickname <> '') AS 参与人数,
  74. -- 均拼单价
  75. ROUND(SUM(p.sold_count * p.unit_price) / NULLIF(COUNT(*), 0), 2) AS 均拼单价,
  76. -- 人均消费(销售额 / 参与人数)
  77. ROUND(
  78. SUM(p.sold_count * p.unit_price) /
  79. NULLIF((SELECT COUNT(DISTINCT r.hit_user_nickname)
  80. FROM deca_report_record r
  81. JOIN deca_product_record pp ON pp.product_code = r.product_code
  82. WHERE pp.merchant_user_id = '881226408'
  83. AND pp.completed_at >= (CURDATE() - INTERVAL 1 DAY) + INTERVAL 17 HOUR AND pp.completed_at <= CURDATE() + INTERVAL 6 HOUR
  84. AND r.hit_user_nickname IS NOT NULL
  85. AND r.hit_user_nickname <> ''), 0),
  86. 2
  87. ) AS 人均消费
  88. FROM deca_product_record p
  89. WHERE p.merchant_user_id = '881226408'
  90. AND p.completed_at >= (CURDATE() - INTERVAL 1 DAY) + INTERVAL 17 HOUR
  91. AND p.completed_at <= CURDATE() + INTERVAL 6 HOUR
  92. AND p.unit_price IS NOT NULL
  93. AND p.sold_count IS NOT NULL
  94. GROUP BY p.merchant_user_id;