SQL 比较每小时总订单并删除当前库存可能吗?

Posted

技术标签:

【中文标题】SQL 比较每小时总订单并删除当前库存可能吗?【英文标题】:SQL Compare Hourly Total Orders and Remove Current Stock Possible? 【发布时间】:2016-08-10 11:59:19 【问题描述】:

不确定这是否可以单独使用 sql 完成,但我宁愿询问然后在流程中添加另一个步骤。

比如说我有一组虚拟订单

+----------+-------------+----------+----------+-----------------+-----+
| Supplier | Destination | Req_Time | Prd_Code | Prd_Description | Qty |
+----------+-------------+----------+----------+-----------------+-----+
| A        | B           | 01:00    |        1 | Chair           | 100 |
| A        | B           | 01:00    |        2 | Desk            |  50 |
| A        | B           | 01:00    |        3 | Phone           |  20 |
| A        | B           | 05:00    |        1 | Chair           | 200 |
| A        | B           | 05:00    |        2 | Desk            |  20 |
+----------+-------------+----------+----------+-----------------+-----+

还有一份当前的股票清单

+----------+----------+----------+-------+
| Supplier | Prd_Code | Prd_Desc | Stock |
+----------+----------+----------+-------+
| A        |        1 | Chair    |   150 |
| A        |        2 | Desk     |    40 |
| A        |        3 | Phone    |   100 |
+----------+----------+----------+-------+

有没有一种方法可以生成存储过程(SQL 2008 - 兼容),可以减去我的库存并留下我需要的东西

+----------+-------------+----------+----------+-----------------+-----+
| Supplier | Destination | Req_Time | Prd_Code | Prd_Description | Qty |
+----------+-------------+----------+----------+-----------------+-----+
| A        | B           | 01:00    |        2 | Desk            |  10 |
| A        | B           | 05:00    |        1 | Chair           | 150 |
| A        | B           | 05:00    |        2 | Desk            |  20 |
+----------+-------------+----------+----------+-----------------+-----+

我想向您展示我的尝试,但在这种情况下,我不知道从哪里开始。

附言 必须感谢这个网站非常容易地为我格式化表格https://ozh.github.io/ascii-tables/

将更加欣赏任何见解和任何示例:D

【问题讨论】:

【参考方案1】:

我手头没有 SQL Server,而且 SQLFiddle 最近对我来说玩得不好,所以这是未经测试的,但逻辑应该可以工作......

WITH
    stock_changes
AS
(
    SELECT Supplier, Destination, Req_Time, Prd_Code, Prd_Description, -Qty AS Qty FROM orders
    UNION ALL
    SELECT Supplier, NULL, '00:00', Prd_Code, Prd_Desc, Stock FROM stock
),
    stock_post_order
AS
(
    SELECT
        *,
        SUM(Qty) OVER (PARTITION BY Supplier, Prd_Code
                           ORDER BY Req_Time
                               ROWS UNBOUNDED PRECEDING
                      )
                         AS new_qty
   FROM
       stock_changes
)
SELECT
    *,
    CASE WHEN new_qty > qty THEN new_qty ELSE qty END   AS order_shortfall
FROM
    stock_post_order
WHERE
    new_qty < 0

首先将您的订单数量反转为负数,因此它们是库存水平将发生变化的数量。

接下来,将您的库存水平与订单合并,所需时间为 0(使其有点像交付库存而不是库存的订单,并排在所有其他订单之前).

接下来,计算一个产品在下单后的总剩余数量是多少;通过总结该产品的所有前面的行(按时间顺序)。 (给Stock - Order1 - Order2, etc, etc

然后选择新库存水平变为负数的行。

【讨论】:

非常好的答案,是的,逻辑看起来不错,我会适应我的场景并让你知道结果。【参考方案2】:

我认为你需要这样的东西:

SELECT
    S.Prd_Code
    ,S.Stock - Ord.OrderedQty AS RemainingStock
FROM Stock S
INNER JOIN 
(
    SELECT 
        Prd_Code
        , SUM(Qty) OrderedQty 
    FROM Orders 
    GROUP BY Prd_Code
) Ord

【讨论】:

那不会因为桌子的短缺而两次给两排。 OP 本质上想知道每个订单少了多少,而不仅仅是每个产品。 (有 40 张办公桌,在 '01:00' 减少 50 个,因此减少了 10 个,然后在 '05:00' 减少了 20 个,因此该订单减少了 20 个。) @MatBailie:谢谢!我想不通。

以上是关于SQL 比较每小时总订单并删除当前库存可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

需要关于 Sql 递归查询的帮助

Spring cloud微服务安全实战-6-1本章概述

如何为需要从以前的订单计算的库存数量编写 SQL

如何写一个条件,以便 sql 语句提取 2 小时前已解决的订单?

sap原材料和库存商品结算不一致

订单减库存设计