使用 T-SQL 获取列中的运行总计

问题描述 投票:0回答:1

我正在尝试编写一个 T-SQL 查询来获取运行的总列数,基本上在我有一个包含我需要的数据的临时表之后

SELECT 
    MQ.[Company], 
    MQ.[status],
    MQ.[Facility],
    MQ.[ItemCode],
    MQ.[Style],
    MQ.[Description],
    CONVERT(date, MQ.[PlannedDate], 101) AS [PlannedDate],
    MONTH(CONVERT(date, CONVERT(date, MQ.[PlannedDate], 101))) AS [PlannedDateMonth],
    YEAR(CONVERT(date, CONVERT(date, MQ.[PlannedDate], 101))) AS [PlannedDateYear],
    MQ.[On-HandApprove],
    MQ.[TransactionQuantity],
    MQ.[OrderNumber],
    MQ.[OrderLineNumber],
    MQ.[WorkOrderNumber],
    MQ.[PurchaseOrderNumber],
    MQ.[PurchaseOrderLineNumber],
    MQ.[OrderQuantity],
    MQ.[InTransit],
    MQ.[OutstandingQuantity],
    MQ.[PODueDate]
FROM 
    #MainQuery MQ
ORDER BY 
    MQ.[ItemCode], CONVERT(date, MQ.[PlannedDate], 101)

但是,我试图根据商品代码及其所在设施获取“运行总量”。创建了一些虚假数据

设施 商品代码 计划日期 即时批准 交易数量 未完成数量 运行总量
P00 07J000061COY050 2024 年 2 月 23 日 1189 984 984 1189
P00 07J000061COY050 2024 年 5 月 10 日 1189 -192 0 1381
P00 07J000061COY050 2024 年 5 月 10 日 1189 192 0 997
P00 07J000061COY050 2024 年 5 月 10 日 1189 312 312 997
P00 07J000061COY050 2024 年 6 月 14 日 1189 -24 0 1021
P00 07J000061COY050 2024 年 6 月 14 日 1189 24 0 997
P00 07J000061COY051 2024 年 2 月 23 日 1500 500 984 1984
P00 07J000061COY051 2024 年 5 月 10 日 1500 -192 0 2176
P00 07J000061COY051 2024 年 5 月 10 日 1500 192 0 1984
D00 07J000061COY051 2024 年 5 月 10 日 1500 312 312 1500

得到它的公式是 对于每个项目代码/设施的第一条记录:

(现有审批 - 交易数量 + 未完成数量)= 运行总数量

对于每个项目代码/设施的下一个记录:

(之前的运行总数量 - 交易数量 + 未结数量)= 运行总数量

所以这基本上就是我想要的,我已经尝试过了

(SUM(MQ.[TransactionQuantity]) OVER (PARTITION BY MQ.[ItemCode],MQ.[Facility] ORDER BY CONVERT(date, MQ.[PlannedDate], 101) ROWS UNBOUNDED PRECEDING) - ISNULL(MQ.[On-HandApprove], 0) ) + ISNULL(MQ.[OutstandingQuantity], 0) AS [RunningTotalTransactionQuantity]

以及它的一些不同的改变,但似乎无法按照我需要的方式得到它......请帮助!!

sql-server t-sql cumulative-sum running-balance
1个回答
0
投票

好吧,我终于得到了它,而且我相信我之前在尝试过的其他变体之一中也得到过它。然而我最终得到了什么(我确信有更好、更有效的方法,但这正在起作用)

SELECT 
    MQ.[Company], 
    MQ.[status],
    MQ.[Facility],
    MQ.[ItemCode],
    MQ.[Style],
    MQ.[Description],
    CONVERT(date, MQ.[PlannedDate], 101) AS [PlannedDate],
    MONTH(CONVERT(date, CONVERT(date, MQ.[PlannedDate], 101))) AS [PlannedDateMonth],
    YEAR(CONVERT(date, CONVERT(date, MQ.[PlannedDate], 101))) AS [PlannedDateYear],
    MQ.[On-HandApprove],
    MQ.[TransactionQuantity],
    MQ.[OrderNumber],
    MQ.[OrderLineNumber],
    MQ.[WorkOrderNumber],
    MQ.[PurchaseOrderNumber],
    MQ.[PurchaseOrderLineNumber],
    MQ.[OrderQuantity],
    MQ.[InTransit],
    MQ.[OutstandingQuantity],
    MQ.[PODueDate]
,SUM(MQ.[TransactionQuantity] + ISNULL(MQ.[InTransit], 0) + MQ.[OutstandingQuantity]) OVER (
    PARTITION BY MQ.[ItemCode], MQ.[Facility]
    ORDER BY CONVERT(date, MQ.[PlannedDate], 101), MQ.[status],MQ.[ItemCode]
    ROWS UNBOUNDED PRECEDING
) + MQ.[On-HandApprove] AS [RunningTotalTransactionQuantity]
,ROW_NUMBER() OVER(PARTITION BY MQ.ItemCode, MQ.Facility ORDER BY CONVERT(date, MQ.PlannedDate, 101)) AS RowNumber
INTO #FinalTable
FROM 
    #MainQuery MQ
ORDER BY 
    MQ.[ItemCode], CONVERT(date, MQ.[PlannedDate], 101)

    
SELECT * FROM 
#FinalTable
ORDER BY [ItemCode], RowNumber 

所以为了得到正确的计算,我这样设置

SUM(MQ.[TransactionQuantity] + ISNULL(MQ.[InTransit], 0) + MQ.[OutstandingQuantity]) OVER (
    PARTITION BY MQ.[ItemCode], MQ.[Facility]
    ORDER BY CONVERT(date, MQ.[PlannedDate], 101), MQ.[status],MQ.[ItemCode]
    ROWS UNBOUNDED PRECEDING
) + MQ.[On-HandApprove] AS [RunningTotalTransactionQuantity]

但是问题是结果没有相加,但我相信这是因为 [PlannedDate] 列,日期字段看起来像“2024-05-10”。按 PlannedDate 排序是我需要做的,但值是相同的,所以我认为每次都会将其按随机顺序排列,使其看起来像是值已关闭,但它们只是乱序。所以我还添加了 ROW_NUMBER 列

,ROW_NUMBER() OVER(PARTITION BY Y.ItemCode, Y.Facility ORDER BY CONVERT(date, Y.PlannedDate, 101)) AS RowNumber

这样,我就可以按 RowNumber 对其进行排序,确保每一行都位于与计算发生时相同的位置。所以现在数据匹配了!感谢大家的帮助/意见!

计划日期 计划日期月份 计划日期年份 现场批准 交易数量 订单数量 在途 未完成数量 运行总交易数量
2024-02-23 2 2024 1496.000000 984.000000 984.000000 0.000000 984.000000 3464.000000
2024-05-10 5 2024 1496.000000 -312.000000 0.000000 0.000000 0.000000 3152.000000
2024-05-10 5 2024 1496.000000 -192.000000 0.000000 0.000000 0.000000 2960.000000
2024-05-10 5 2024 1496.000000 192.000000 0.000000 0.000000 0.000000 3152.000000
2024-05-10 5 2024 1496.000000 312.000000 0.000000 0.000000 0.000000 3464.000000
2024-06-14 6 2024 1496.000000 -24.000000 0.000000 0.000000 0.000000 3440.000000
2024-06-14 6 2024 1496.000000 24.000000 0.000000 0.000000 0.000000 3464.000000
© www.soinside.com 2019 - 2024. All rights reserved.