【问题标题】:SQL find the day in October with highest sales from stores with promotionSQL 查找 10 月促销商店销售额最高的一天
【发布时间】:2019-11-25 21:20:33
【问题描述】:

我是这里的 SQL 初学者,真的很努力应对这样的挑战:

全年都有在线活动,我想知道:

  1. 10 月份的每一天,总共有多少家店铺参与,总共产生了多少订单,总共产生了多少销售额。

  2. 参加活动的店铺销量最大的日期是哪一天,销量是多少,以及所有店铺(参加与否)的总销量是多少。

我使用的 DMBS 是 Postgres。提前非常感谢!

这是我的表格:

表 1 - ele_slr_wide(所有商店 ID)

shop_id  
A000001
A000002
A000003

表 2 - ele_slr_ord_wide_di(所有订单)

shop_id  order_id activity_id   pay_time   pay_amt
A000001  001       001         2019-10-25  100
A000001  002       002         2019-10-25  200
A000002  003       002         2019-10-27  200
A000003  004       NA          2019-10-25  100   

表 3 - ele_slr_act_wide(参与的商店)

shop_id  activity_id   start_time  end_time
A000001  001           2019-9-25   2019-10-31
A000001  002           2019-10-5   2019-10-31
A000002  002           2019-10-5   2019-10-31

表 4 - ele_slr_ord_wide_di(参与店铺订单)

shop_id  order_id activity_id   pay_time   pay_amt
A000001  001       001         2019-10-25  100
A000001  002       001         2019-10-25  200
A000002  003       002         2019-10-27  200

预期输出 1:

Date      Participated_stores_count  total_orders   total_sales
2019-10-1           xxx                 xxx             xxx
...
2019-10-31          xxx                 xxx             xxx

预期输出 2:

Date_max_sales   sales_participated_stores   total_sales
2019-10-15           300                      400

【问题讨论】:

    标签: sql postgresql max left-join


    【解决方案1】:

    试试下面

    DB FIDDLE

    查询 1:

    WITH numbers as
    (
        SELECT date_trunc('day', dd):: date
        FROM generate_series( '2019-10-01'::timestamp , '2019-10-31'::timestamp, '1 day'::interval) dd
    )
    SELECT date_trunc,COUNT(DISTINCT E.shop_id) ParticipatedStores, COUNT(DISTINCT ES.order_id) TotalOrders, SUM(ES.pay_amt) total_sales
    FROM numbers n LEFT JOIN ele_slr_act_wide E ON   date_trunc BETWEEN E.start_time AND E.end_time
    LEFT JOIN ele_slr_ord_wide_di ES ON E.shop_id = ES.shop_id AND  date_trunc = ES.pay_time
    GROUP BY  date_trunc;
    

    查询 2:

    WITH numbers as
    (
        SELECT date_trunc('day', dd):: date
        FROM generate_series( '2019-10-01'::timestamp , '2019-10-31'::timestamp, '1 day'::interval) dd
    )
    SELECT date_trunc,COUNT(DISTINCT E.shop_id) ParticipatedStores, COUNT(DISTINCT ES.order_id) TotalOrders, SUM(ES.pay_amt) total_sales
    FROM numbers n LEFT JOIN ele_slr_act_wide E ON   date_trunc BETWEEN E.start_time AND E.end_time
    LEFT JOIN ele_slr_ord_wide_di ES ON E.shop_id = ES.shop_id AND  date_trunc = ES.pay_time
    GROUP BY  date_trunc
    ORDER BY CASE WHEN SUM(ES.pay_amt) IS NULL THEN 0 ELSE SUM(ES.pay_amt) END DESC
    limit 1;
    

    输出将是

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2016-03-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多