stats.sql 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. -- ============================================================
  2. -- 得卡 DECA 统计 SQL(面向领导三类需求:新增 / 商家账号 / 商品售卖进度)
  3. -- 说明:
  4. -- * 主表 gmt_create_time = 首次入库时间(upsert 不更新它),故可代表「新发现」的日期。
  5. -- * 售卖进度趋势取自每日快照表 deca_product_daily_record(按 snapshot_date)。
  6. -- * 用到窗口函数 LAG,需 MySQL 8.0+。
  7. -- ============================================================
  8. -- ========== 一、新增 ==========
  9. -- 1.1 每日新增商家数(按首次入库日)
  10. SELECT DATE(gmt_create_time) AS dt, COUNT(*) AS new_shops
  11. FROM deca_shop_record
  12. GROUP BY DATE(gmt_create_time)
  13. ORDER BY dt DESC;
  14. -- 1.2 每日新增商品数(按首次入库日)
  15. SELECT DATE(gmt_create_time) AS dt, COUNT(*) AS new_products
  16. FROM deca_product_record
  17. GROUP BY DATE(gmt_create_time)
  18. ORDER BY dt DESC;
  19. -- 1.3 今日新增(商家 + 商品)汇总
  20. SELECT
  21. (SELECT COUNT(*) FROM deca_shop_record WHERE DATE(gmt_create_time) = CURDATE()) AS today_new_shops,
  22. (SELECT COUNT(*) FROM deca_product_record WHERE DATE(gmt_create_time) = CURDATE()) AS today_new_products;
  23. -- ========== 二、商家账号 ==========
  24. -- 2.1 商家账号总览(按在售团购数倒序)
  25. SELECT merchant_user_id, merchant_name, fans_count, active_groupbuy_count,
  26. gmt_create_time AS first_seen, gmt_modified_time AS last_seen
  27. FROM deca_shop_record
  28. ORDER BY active_groupbuy_count DESC, fans_count DESC;
  29. -- 2.2 商家维度的在售商品与售卖情况(关联商品表实时汇总)
  30. SELECT s.merchant_user_id, s.merchant_name, s.fans_count,
  31. COUNT(p.product_code) AS product_cnt,
  32. COALESCE(SUM(p.sold_count), 0) AS total_sold,
  33. COALESCE(SUM(p.card_count), 0) AS total_card,
  34. ROUND(SUM(p.sold_count) / NULLIF(SUM(p.card_count), 0) * 100, 2) AS sold_pct
  35. FROM deca_shop_record s
  36. LEFT JOIN deca_product_record p ON p.merchant_user_id = s.merchant_user_id
  37. GROUP BY s.merchant_user_id, s.merchant_name, s.fans_count
  38. ORDER BY total_sold DESC;
  39. -- ========== 三、商品售卖进度 ==========
  40. -- 3.1 全部商品当前售卖进度(已售/总数/剩余/进度百分比)
  41. SELECT product_code, merchant_name, title,
  42. sold_count, card_count, available_stock,
  43. ROUND(sold_count / NULLIF(card_count, 0) * 100, 2) AS sold_pct,
  44. groupbuy_status_name, unit_price, gmt_modified_time AS updated_at
  45. FROM deca_product_record
  46. ORDER BY sold_pct DESC;
  47. -- 3.2 单个商品的每日售卖进度趋势(把 :code 换成具体 product_code)
  48. SELECT snapshot_date, sold_count, available_stock, card_count,
  49. ROUND(sold_count / NULLIF(card_count, 0) * 100, 2) AS sold_pct
  50. FROM deca_product_daily_record
  51. WHERE product_code = :code
  52. ORDER BY snapshot_date;
  53. -- 3.3 每个商品「每日新卖出」增量(今日累计已售 - 昨日累计已售)
  54. SELECT product_code, snapshot_date, sold_count,
  55. sold_count - LAG(sold_count) OVER (PARTITION BY product_code ORDER BY snapshot_date) AS daily_sold
  56. FROM deca_product_daily_record
  57. ORDER BY product_code, snapshot_date;
  58. -- 3.4 全站每日售出增量汇总(当天所有商品比前一天多卖出的份数合计)
  59. SELECT snapshot_date,
  60. SUM(daily_sold) AS total_daily_sold
  61. FROM (
  62. SELECT product_code, snapshot_date,
  63. sold_count - LAG(sold_count) OVER (PARTITION BY product_code ORDER BY snapshot_date) AS daily_sold
  64. FROM deca_product_daily_record
  65. ) t
  66. WHERE daily_sold IS NOT NULL
  67. GROUP BY snapshot_date
  68. ORDER BY snapshot_date DESC;
  69. -- 3.5 即将售罄 / 售罄商品(剩余库存少或进度高,便于关注热销)
  70. SELECT product_code, merchant_name, title, sold_count, card_count, available_stock,
  71. ROUND(sold_count / NULLIF(card_count, 0) * 100, 2) AS sold_pct, groupbuy_status_name
  72. FROM deca_product_record
  73. WHERE card_count > 0
  74. ORDER BY sold_pct DESC, available_stock ASC
  75. LIMIT 50;