提问人:Demacrado 提问时间:11/22/2022 更新时间:11/23/2022 访问量:48
SQL 捆绑包产品操作
SQL bundle product manipulation
问:
在我的公司,我们销售由不同产品混合而成的捆绑产品。单个产品 (product_sku) 的齿轮(销售成本)会随着时间的推移而变化,因此捆绑包的齿轮将发生变化。
我需要编写一个 SQL 查询,能够从产品齿轮的历史值中获取捆绑包随时间推移的总齿轮数。捆束的齿轮数是产品的齿轮数之和乘以相应时间范围内的数量。
一个捆绑包可以由 2 个或多个产品组成,不同的产品具有不同的数量。 捆绑包示例:(1xA|1xB, 1xA|1xB|2xC, 1xA|2xB|1xC|2xD...)
产品在不遵循任何模式的情况下更改价格,任何组合都是可能的。
这里有一个我可能会遇到的可能捆绑包的示例:
输入表:
捆 | 数量 | product_sku | 齿轮 | valid_from | valid_to |
---|---|---|---|---|---|
1xA|1xB | 1 | 一个 | 3 | 2022-01-01 | 2023-01-01 |
1xA|1xB | 1 | B | 4 | 2021-01-01 | 2023-01-01 |
1xA|1xB | 1 | 一个 | 6 | 2020-01-01 | 2022-01-01 |
1xA|1xB | 1 | B | 5 | 2014-01-01 | 2021-01-01 |
1xA|1xB | 1 | 一个 | 2 | 2014-01-01 | 2020-01-01 |
这就是我想得到的:
输出表:
捆 | 齿轮 | valid_from | valid_to |
---|---|---|---|
1xA|1xB | 7 | 2022-01-01 | 2023-01-01 |
1xA|1xB | 10 | 2021-01-01 | 2022-01-01 |
1xA|1xB | 11 | 2020-01-01 | 2021-01-01 |
1xA|1xB | 7 | 2014-01-01 | 2020-01-01 |
我真的不知道如何处理这个问题。我被输入表卡住了。我试过使用窗口函数,我试过使用带有日期的条件,但结果总是不成功......
我遇到的主要问题是捆绑包可以拥有的产品数量不确定,这让我怀疑这在 SQL 中是否可以实现。
关于我该怎么做的任何想法?有什么我不知道的功能吗?我认为答案在于使用窗口函数,但我真的不知道怎么做。
答:
0赞
Demacrado
11/23/2022
#1
我能够通过 CROSS JOIN 解决 2 个产品的捆绑包,但我仍然找不到包含 3 个或更多产品的捆绑包的通用解决方案......
SELECT
o.bundle_sku,
o.quantity * o.cogs + s.quantity*s.cogs as Cogs,
GREATEST(o.dbt_valid_from, s.dbt_valid_from) dbt_valid_from,
LEAST(o.dbt_valid_to, s.dbt_valid_to) dbt_valid_to,
FROM test_table o CROSS JOIN test_table s
WHERE o.sku != s.sku
AND o.dbt_valid_to > s.dbt_valid_from
AND o.dbt_valid_to <= s.dbt_valid_to
ORDER BY o.dbt_valid_from DESC
评论