我正在尝试编写一个 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]
以及它的一些不同的改变,但似乎无法按照我需要的方式得到它......请帮助!!
好吧,我终于得到了它,而且我相信我之前在尝试过的其他变体之一中也得到过它。然而我最终得到了什么(我确信有更好、更有效的方法,但这正在起作用)
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 |