sql - 供应数量总和达到需求数量时的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
我很感激任何帮助。
解决方案
在没有使用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
推荐阅读
- vue.js - 在 vuejs 中使 am4Charts 具有响应性
- python - 如何在测试集上应用 TFIDF
- javascript - 如何比较车把中变量的值
- ruby-on-rails - 如何按字母和数字对标题进行排序?
- html - 不要将 css 添加到活动类的链接中
- opayo - 直接协议 4.00 - ThreeDSRequestorPriorAuthenticationInfo.threeDSReqPriorRef - 我如何填充它?
- python - 从数据框中获取值到一系列 Web API 请求中
- asp.net - 希望 Forms 和 Windows 身份验证在组合模式下工作
- angular - 仅显示 *ngIf 表达式的第一个匹配项
- javascript - 如何合并多个draft-js ContentState