Sql server 如何计算特定日期或更好日期的运行总数?

Sql server 如何计算特定日期或更好日期的运行总数?,sql-server,tsql,sql-server-2016,Sql Server,Tsql,Sql Server 2016,在目前完成尽可能多的订单后,我想计算一下可以完成哪些订单以及缺少哪些日期(diff)。按顺序挑选 当考虑到这个问题时,我认为某种基于股票日期和订单的流动金额将是一种方法。基于和其他类似的线程,这似乎是一个很好的问题适合-但我对其他解决方案持开放态度 示例代码 结果 为了尽可能简化核心问题,我去掉了诸如项目编号、不同需求(仅使用确切日期和日期或更好的日期)等复杂因素 编辑1: 更新了表和结果中的行(正确且与原始查询一致)。 2017年8月25日,第一个答案的差值为-12,而不是0。但2017-08

在目前完成尽可能多的订单后,我想计算一下可以完成哪些订单以及缺少哪些日期(diff)。按顺序挑选

当考虑到这个问题时,我认为某种基于股票日期和订单的流动金额将是一种方法。基于和其他类似的线程,这似乎是一个很好的问题适合-但我对其他解决方案持开放态度

示例代码 结果 为了尽可能简化核心问题,我去掉了诸如项目编号、不同需求(仅使用确切日期和日期或更好的日期)等复杂因素

编辑1: 更新了表和结果中的行(正确且与原始查询一致)。
2017年8月25日,第一个答案的差值为-12,而不是0。但2017-08-26是正确的

您可以使用以下查询:

;WITH ORDER_RUN AS (
   SELECT SUM(SUM(QUANTITY)) OVER (ORDER BY DATE_OUTGO)  AS ORDER_RUNTOTAL,
          DATE_OUTGO
   FROM @orderTable
   GROUP BY DATE_OUTGO
), STOCK_RUN AS (
   SELECT SUM(SUM(QUANTITY)) OVER (ORDER BY DATE_OUTGO) AS STOCK_RUNTOTAL, 
          DATE_OUTGO
   FROM @stockTable
   GROUP BY DATE_OUTGO
)
SELECT ORR.DATE_OUTGO AS OT_DATE_OUTGO,
       X.STOCK_RUNTOTAL - ORDER_RUNTOTAL  AS DIFF
FROM ORDER_RUN AS ORR
OUTER APPLY (
   SELECT TOP 1 STOCK_RUNTOTAL
   FROM STOCK_RUN AS SR
   WHERE SR.DATE_OUTGO <= ORR.DATE_OUTGO
   ORDER BY SR.DATE_OUTGO DESC) AS X


它在2017-08-26上给出了
-26
,是的,我正要写@RuslanK。它似乎与日期完全匹配,而不是“这个或更好”。这样,日期为2017-08-27的股票就不会受到影响。@Danieboy我恐怕不明白这是更好的部分。你能解释一下这个问题吗?我的意思是,在特定日期下的订单如何消耗未来新增的库存?例如。订单4于2017年8月26日或更高日期订购。因此,如果2017年8月26日没有库存,您可以从任何未来日期中选择。因此,在这种情况下,您可以从批次1002中选择日期为2017-08-27的订单4,因为它比订单日期“更好”(更晚)。这是否消除了混淆?进一步调查后,我发现在另一个案例中,结果不正确,但很接近!我已经编辑了这个问题。你有没有可能看一下?提前谢谢。
The correct result would look like this.
-------------------------
| OT_DATE_OUTGO | DIFF  |
-------------------------
| 2017-08-25    | 0     |
-------------------------
| 2017-08-26    | -18   |
-------------------------

My result currently looks like this.
-------------------------
| OT_DATE_OUTGO | DIFF  |
-------------------------
| 2017-08-25    | 80    |
-------------------------
| 2017-08-26    | 106   |
-------------------------
;WITH ORDER_RUN AS (
   SELECT SUM(SUM(QUANTITY)) OVER (ORDER BY DATE_OUTGO)  AS ORDER_RUNTOTAL,
          DATE_OUTGO
   FROM @orderTable
   GROUP BY DATE_OUTGO
), STOCK_RUN AS (
   SELECT SUM(SUM(QUANTITY)) OVER (ORDER BY DATE_OUTGO) AS STOCK_RUNTOTAL, 
          DATE_OUTGO
   FROM @stockTable
   GROUP BY DATE_OUTGO
)
SELECT ORR.DATE_OUTGO AS OT_DATE_OUTGO,
       X.STOCK_RUNTOTAL - ORDER_RUNTOTAL  AS DIFF
FROM ORDER_RUN AS ORR
OUTER APPLY (
   SELECT TOP 1 STOCK_RUNTOTAL
   FROM STOCK_RUN AS SR
   WHERE SR.DATE_OUTGO <= ORR.DATE_OUTGO
   ORDER BY SR.DATE_OUTGO DESC) AS X
WHERE SR.DATE_OUTGO <= ORR.DATE_OUTGO
WHERE STOCK_RUNTOTAL <= ORDER_RUNTOTAL
;WITH ORDER_RUN AS (
   SELECT SUM(SUM(QUANTITY)) OVER (ORDER BY DATE_OUTGO)  AS ORDER_RUNTOTAL,
          DATE_OUTGO
   FROM @orderTable
   GROUP BY DATE_OUTGO
), STOCK_RUN AS (
   SELECT SUM(SUM(QUANTITY)) OVER (ORDER BY DATE_OUTGO) AS STOCK_RUNTOTAL, 
          SUM(SUM(QUANTITY)) OVER () AS TOTAL_STOCK,
          DATE_OUTGO
   FROM @stockTable
   GROUP BY DATE_OUTGO
)
SELECT ORR.DATE_OUTGO AS OT_DATE_OUTGO, 
       CASE 
          WHEN X.STOCK_RUNTOTAL - ORDER_RUNTOTAL >= 0 THEN 0  
          ELSE X.STOCK_RUNTOTAL - ORDER_RUNTOTAL
       END AS DIFF
FROM ORDER_RUN AS ORR
OUTER APPLY (
   SELECT TOP 1 STOCK_RUNTOTAL
   FROM STOCK_RUN AS SR
   WHERE STOCK_RUNTOTAL >= ORDER_RUNTOTAL -- Stop if stock quantity has exceeded order quantity
         OR
         STOCK_RUNTOTAL = TOTAL_STOCK     -- Stop if the end of stock has been reached
   ORDER BY SR.DATE_OUTGO) AS X