首页 > 解决方案 > 供应数量总和达到需求数量时的SQL?

问题描述

我想在 SqlServer 2014 中从两个表中生成一个查询,彼此没有关系。

第一个代表需求。第二个代表他们的用品。

Demands(
    [DemandId] [int] NOT NULL,
    [ItemCode] [nvarchar](50) NULL,
    [TotalCount] [int] NULL,
    [Date] [datetime] NULL)

Supplies(
    [SupplyId] [int] NOT NULL,
    [ItemCode] [nvarchar](50) NULL,
    [Count] [int] NULL,
    [Date] [datetime] NULL)

例如,我们有一个需求,有(TotalCount = 1000, ItemCode = 1, Date = d1) 两个供应,(Date = d2, Count = 300, ItemCode = 1)需求(Date = d3, Count = 700, ItemCode = 1) 完成d3 Date,所以我想要一个查询来指示供应何时完成需求。

考虑以下数据:

在此处输入图像描述

结果应该是:

Item01 2020-01-07

Item02 2020-01-06

我很感激任何帮助。

标签: sqlsql-serverdatabase

解决方案


在没有使用SUM() OVER()来生成累积和的情况下,您可以使用三角连接(将当前行加入所有前面的行),但在大型数据集上速度非常慢......

WITH
  NetContribution AS
(
  SELECT [ItemCode], [Date], SUM([Count]) AS [Count]
    FROM (
           SELECT [ItemCode], [Date],  [Count]      FROM Supplies
           UNION ALL
           SELECT [ItemCode], [Date], -[TotalCount] FROM Demands
         )
          combined
GROUP BY [ItemCode], [Date]
),
  NetAvailability AS
(
  SELECT
    a.[ItemCode],
    a.[Date],
    a.[Count]       AS Delta,
    SUM(b.[Count])  AS Amount
  FROM
    NetContribution AS a
  INNER JOIN
    NetContribution AS b
      ON  a.[ItemCode]  = b.[ItemCode]
      AND a.[Date]     >= b.[Date]
  GROUP BY
    a.[ItemCode],
    a.[Date],
    a.[Count]
)
SELECT
  *
FROM
  NetAvailability
WHERE
  Amount >= 0

https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=48660224fc63bcb2803f5a08b8b1311e


推荐阅读