【发布时间】:2020-11-06 10:35:54
【问题描述】:
我是所有 excel 和 power query 的长期用户,但在 SQL 方面我完全是一个脑残的菜鸟。
我的项目的目标是按组找到运行总计中的最小值。
我已经能够弄清楚如何计算基本运行总计。我的下一个想法是针对我的运行总计查询运行另一个查询,其中我在运行总计列上运行另一个聚合函数以返回最小值。当我这样做时,查询将永远旋转,然后返回错误...
我会注意到我正在 MS Access 中创建 SQL 代码,因为我目前无法访问我可以在工作中使用的 SQL 服务器。
所以首先我创建一个联合查询来将多个表组合在一起并将该查询称为“组合”:
SELECT [ItemCode], '1/1/2010' as [Date], 'IM' as [Type], [WarehouseCode], [QuantityOnHand] as [Qty]
FROM [IM_ItemWarehouse]
UNION ALL
SELECT [ItemCode], [RequiredDate] as [Date], 'PO' as [Type], [WarehouseCode], [QuantityOrdered] - [QuantityReceived] as [Qty]
FROM [PO_PurchaseOrderDetail]
WHERE [QuantityOrdered] - [QuantityReceived] > 0
UNION ALL
SELECT [ItemCode], [PromiseDate] as [Date], 'SO' as [Type], [WarehouseCode], ([QuantityOrdered] -
[QuantityShipped])*-1 as [Qty]
FROM [SO_SalesOrderDetail]
WHERE [QuantityOrdered] - [QuantityShipped] > 0;
然后我去 oldschool 并使用嵌套的 select 语句来计算我的运行总计并将此查询称为“RunTotal”:
SELECT t1.[ItemCode], t1.[WarehouseCode], t1.[Date], sum(t1.[Qty]) AS TotalByDate, (SELECT
sum(t2.[Qty])
FROM Combined t2
WHERE t2.[ItemCode] = t1.[ItemCode] AND t2.[WarehouseCode] = t1.[WarehouseCode] AND t2.[Date] <= t1.[Date]) AS RunningTotal
FROM Combined t1
GROUP BY t1.[ItemCode], t1.[WarehouseCode], t1.[Date]
ORDER BY t1.[ItemCode], t1.[WarehouseCode], t1.[Date];
然后...卡住了...这是我尝试过的,但到目前为止,查询只是永远旋转或返回错误:
SELECT [ItemCode], [WarehouseCode], min([RunningTotal])
FROM RunTotal
GROUP BY [ItemCode], [WarehouseCode];
提前感谢您提供的任何帮助...我知道使用窗口函数可以更有效地计算运行总和,但是由于我在 MS Access 中编写这些 SQL 语句,所以我没有访问性感花哨的东西,如 OVER 和 PARTITION BY...
示例基础数据:
Style Type Whs Date Qty
widget On Hand NVR 1/1/2010 100
widget On SO NVR 7/15/2020 -30
widget On PO NVR 7/18/2020 50
widget On SO NVR 7/19/2020 -10
widget On SO NVR 7/20/2020 -60
gizmo On Hand NVR 1/1/2010 100
gizmo On SO NVR 7/15/2020 -100
gizmo On PO NVR 7/18/2020 50
gizmo On SO NVR 7/19/2020 -20
gizmo On SO NVR 7/20/2020 -30
示例运行总计:
Style Type Whs Date Qty RunTotal
widget On Hand NVR 1/1/2010 100 100
widget On SO NVR 7/15/2020 -30 70
widget On PO NVR 7/18/2020 50 120
widget On SO NVR 7/19/2020 -10 110
widget On SO NVR 7/20/2020 -60 50
gizmo On Hand NVR 1/1/2010 100 100
gizmo On SO NVR 7/15/2020 -90 10
gizmo On PO NVR 7/18/2020 50 60
gizmo On SO NVR 7/19/2020 -20 40
gizmo On SO NVR 7/20/2020 -10 30
示例最终结果:
Style Whs MinRunTotal
widget NVR 50
gizmo NVR 10
【问题讨论】:
-
样本数据和期望的结果会很有帮助。
-
@GordonLinoff 我已经更新了我的帖子...谢谢您的建议...嗯,这会很有帮助...我的坏...
-
您可能必须将运行总和数据写入临时表,然后在该表中查询最小值。
-
日期是保留字(内在函数)。不应使用保留字作为名称。
标签: sql ms-access group-by aggregate cumulative-sum