首页 > 解决方案 > SQL 我想弄清楚如何在每个产品和每个组内获得 10 天的销售额

问题描述

我有一个 SQL Server 表 T1,其中包含每天按产品 ID、品牌和尺寸排列的订单。

T1:

+------------+-------+------+----------+--------+
| product_id | Brand | Size |   Date   | Orders |
+------------+-------+------+----------+--------+
|          1 |     1 | 11   | 10/18/18 |      1 |
|          1 |     1 | 6    | 10/18/18 |      2 |
|          1 |     1 | 10   | 10/18/18 |      1 |
|          1 |     1 | 7    | 10/18/18 |      3 |
|          1 |     1 | 8.5  | 10/18/18 |      5 |
|          1 |     1 | 9.5  | 10/18/18 |      2 |
|          2 |     1 | 8    | 10/19/18 |      3 |
|          2 |     1 | 7    | 10/19/18 |      6 |
|          2 |     1 | 9    | 10/19/18 |      2 |
|          3 |     2 | 5    | 10/19/18 |     23 |
|          3 |     2 | 6    | 10/19/18 |      6 |
|          3 |     2 | 10   | 10/19/18 |      7 |
+------------+-------+------+----------+--------+

我还有一个表 T2,其中包含每个 product_id 的发布日期。一个 product_id 可能有多个发布日期,表示它已“补货”。

T2:

+------------+-------------+
| product_id | launch_date |
+------------+-------------+
|          1 | 8/18/18     |
|          1 | 10/18/18    |
|          2 | 10/18/18    |
|          3 | 4/18/18     |
+------------+-------------+

我的目标是创建一个表,其中包含每个发布日期前 10 天的订单(针对每个产品 ID、品牌和尺寸)。因此,如果产品 1 的发布日期是 8/18/18 和 10/18/18,那么我想要从 8/18/18 到 8/28/18 以及从 10/18/18 到 10/28 的每日订单/18。

我将如何去创建这个表?

示例输出:

+------------+-------+------+----------+--------+
| product_id | Brand | Size |   Date   | Orders |
+------------+-------+------+----------+--------+
| 1          |     1 | 11   | 10/18/18 |      1 |
| 1          |     1 | 6    | 10/18/18 |      2 |
| 1          |     1 | 10   | 10/18/18 |      1 |
| 1          |     1 | 7    | 10/18/18 |      3 |
| 1          |     1 | 8.5  | 10/18/18 |      5 |
| 1          |     1 | 9.5  | 10/18/18 |      2 |
| …          |       |      |          |        |
| 1          |     1 | 11   | 10/22/18 |      4 |
| 1          |     1 | 6    | 10/22/18 |      6 |
| 1          |     1 | 10   | 10/22/18 |      2 |
| 1          |     1 | 7    | 10/22/18 |      2 |
| 1          |     1 | 8.5  | 10/22/18 |      2 |
| 1          |     1 | 9.5  | 10/22/18 |      5 |
| …          |       |      |          |        |
| 1          |     1 | 11   | 10/28/18 |      7 |
| 1          |     1 | 6    | 10/28/18 |      4 |
| 1          |     1 | 10   | 10/28/18 |      2 |
| 1          |     1 | 7    | 10/28/18 |      2 |
| 1          |     1 | 8.5  | 10/28/18 |      8 |
| 1          |     1 | 9.5  | 10/28/18 |      7 |
| …          |       |      |          |        |
| 2          |     1 | 8    | 10/19/18 |      3 |
| 2          |     1 | 7    | 10/19/18 |      6 |
| 2          |     1 | 9    | 10/19/18 |      2 |
| 3          |     2 | 5    | 10/19/18 |     23 |
| 3          |     2 | 6    | 10/19/18 |      6 |
| 3          |     2 | 10   | 10/19/18 |      7 |
+------------+-------+------+----------+--------+

谢谢!


编辑:包括我到目前为止所尝试的:

我的想法是尝试创建加入launch_date,然后创建一个列,即启动日期和订购日期之间的天数。然后我可以过滤 WHERE 该列小于或等于 10。

这是我正在使用的查询:

with temp as (
        select
            t1.product_id, t1.brand, t1.size, t1.date, t1.orders, t2.launch_date
        from t1
        left join t2 on t1.product_id = t2.product_id and t1.order_date = t2.order_date 
        )


    select product_id,
           brand,
           size,
           size,
           date,
           orders,
           launch_date
        from temp
        ;

为了使我的推理起作用,我需要在 launch_date 为空的地方前向填充它。我不知道如何做到这一点。这是我到目前为止的输出:

+------------+-------+------+----------+--------+-------------+
| product_id | Brand | Size |   Date   | Orders | launch_date |
+------------+-------+------+----------+--------+-------------+
| 1          |     1 | 11   | 10/18/18 |      1 | 10/18/18    |
| 1          |     1 | 6    | 10/18/18 |      2 | 10/18/18    |
| 1          |     1 | 10   | 10/18/18 |      1 | 10/18/18    |
| 1          |     1 | 7    | 10/18/18 |      3 | 10/18/18    |
| 1          |     1 | 8.5  | 10/18/18 |      5 | 10/18/18    |
| 1          |     1 | 9.5  | 10/18/18 |      2 | 10/18/18    |
| …          |       |      |          |        |             |
| 1          |     1 | 11   | 10/22/18 |      4 | NULL        |
| 1          |     1 | 6    | 10/22/18 |      6 | NULL        |
| 1          |     1 | 10   | 10/22/18 |      2 | NULL        |
| 1          |     1 | 7    | 10/22/18 |      2 | NULL        |
| 1          |     1 | 8.5  | 10/22/18 |      2 | NULL        |
| 1          |     1 | 9.5  | 10/22/18 |      5 | NULL        |
| …          |       |      |          |        |             |
| 1          |     1 | 11   | 10/28/18 |      7 | NULL        |
| 1          |     1 | 6    | 10/28/18 |      4 | NULL        |
| 1          |     1 | 10   | 10/28/18 |      2 | NULL        |
| 1          |     1 | 7    | 10/28/18 |      2 | NULL        |
| 1          |     1 | 8.5  | 10/28/18 |      8 | NULL        |
| 1          |     1 | 9.5  | 10/28/18 |      7 | NULL        |
| …          |       |      |          |        |             |
| 2          |     1 | 8    | 10/19/18 |      3 | 10/18/18    |
| 2          |     1 | 7    | 10/19/18 |      6 | 10/18/18    |
| 2          |     1 | 9    | 10/19/18 |      2 | 10/18/18    |
| 3          |     2 | 5    | 10/19/18 |     23 | 10/18/18    |
| 3          |     2 | 6    | 10/19/18 |      6 | 10/18/18    |
| 3          |     2 | 10   | 10/19/18 |      7 | 10/18/18    |
+------------+-------+------+----------+--------+-------------+

如果我可以将 launch_date 向前填充为 NULL 的地方,使其成为该 product_id 的最新 launch_date,那么我将能够创建一个列来减去日期。

标签: sql-servergroup-bydata-analysis

解决方案


推荐阅读