使用分区获取工作中心的 运行 余额
Get running balance of a work center using partition
我正在编写一个脚本,它将 运行 在 SQL Server 2014 上。
我有一个 table 交易记录从一个工作中心转移到另一个工作中心。简化后的 table 如下:
DECLARE @transactionTable TABLE (wono varchar(10),transferDate date
,fromWC varchar(10),toWC varchar(10),qty float)
INSERT INTO @transactionTable
SELECT '0000000123','5/10/2018','STAG','PP-B',10
UNION
SELECT '0000000123','5/11/2018','PP-B','PP-T',5
UNION
SELECT '0000000123','5/11/2018','PP-T','TEST',3
UNION
SELECT '0000000123','5/12/2018','PP-B','PP-T',5
UNION
SELECT '0000000123','5/12/2018','PP-T','TEST',5
UNION
SELECT '0000000123','5/13/2018','PP-T','TEST',2
UNION
SELECT '0000000123','5/13/2018','TEST','FGI',8
UNION
SELECT '0000000123','5/14/2018','TEST','FGI',2
SELECT *,
fromTotal = -SUM(qty) OVER(PARTITION BY fromWC ORDER BY wono, transferdate, fromWC),
toTotal = SUM(qty) OVER(PARTITION BY toWC ORDER BY wono, transferdate, toWC)
FROM @transactionTable
ORDER BY wono, transferDate, fromWC
我想在每次交易后获得 fromWC 和 toWC 的 运行ning 余额。
根据上面的记录,最终结果应该是这样的:
我相信可以使用SUM(qty) OVER(PARTITION BY...
,但我不确定如何写语句。当我尝试增加和减少时,每一行总是结果为 0。
如何编写 SUM
语句来达到预期的结果?
更新
此图显示每笔交易、生成的 WC 数量,并突出显示每笔交易对应的 from
和 to
工作中心。
比如5/11看第二条记录,3条从PP-T转移到TEST。交易后PP-B有5个,PP-T有2个,TEST有3个
我可以接近,除了起始余额:
SELECT wono, transferDate, fromWC, toWC, qty,
SUM( CASE WHEN WC = fromWC THEN RunningTotal ELSE 0 END ) AS FromQTY,
SUM( CASE WHEN WC = toWC THEN RunningTotal ELSE 0 END ) AS ToQTY
FROM( -- b
SELECT *, SUM(Newqty) OVER(PARTITION BY WC ORDER BY wono,transferdate, fromWC, toWC) AS RunningTotal
FROM(-- a
SELECT wono, transferDate, fromWC, toWC, fromWC AS WC, qty, -qty AS Newqty, 'From' AS RecType
FROM @transactionTable
UNION ALL
SELECT wono, transferDate, fromWC, toWC, toWC AS WC, qty, qty AS Newqty, 'To' AS RecType
FROM @transactionTable
) AS a
) AS b
GROUP BY wono, transferDate, fromWC, toWC, qty
我的逻辑假设所有余额都从 0 开始,因此 "STAG" 余额将为 -10。
查询的工作原理:
- "Unpivot" 将输入记录设置为 "From" 和 "To" 记录,并为 "From" 记录取反数量。
- 计算每个 "WC" 的 运行 总数。
- 将 "Unpivoted" 记录合并回原始形状
解决方案 2
WITH CTE
AS(
SELECT *,
ROW_NUMBER() OVER( ORDER BY wono, transferDate, fromWC, toWC ) AS Sequence
FROM @transactionTable
),
CTE2
AS(
SELECT *,
fromTotal = -SUM(qty) OVER(PARTITION BY fromWC ORDER BY Sequence),
toTotal = SUM(qty) OVER(PARTITION BY toWC ORDER BY Sequence)
FROM CTE
)
SELECT a.Sequence, b.Sequence, c.Sequence, a.wono, a.transferDate, a.fromWC, a.toWC, a.qty, a.fromTotal + ISNULL( b.toTotal, 0 ) AS FromTotal, a.toTotal + ISNULL( c.fromTotal, 0 ) AS ToTotal
FROM CTE2 AS a
OUTER APPLY( SELECT TOP 1 * FROM CTE2 WHERE wono = a.wono AND Sequence < a.Sequence AND toWC = a.fromWC ORDER BY Sequence DESC ) AS b
OUTER APPLY( SELECT TOP 1 * FROM CTE2 WHERE wono = a.wono AND Sequence < a.Sequence AND fromWC = a.toWC ORDER BY Sequence DESC ) AS c
ORDER BY a.Sequence
注意:此解决方案将从 "ID" 列中受益匪浅,它反映了交易顺序,或者至少您需要 wono, transferDate, fromWC, toWC
[ 上的索引=13=]
我正在编写一个脚本,它将 运行 在 SQL Server 2014 上。
我有一个 table 交易记录从一个工作中心转移到另一个工作中心。简化后的 table 如下:
DECLARE @transactionTable TABLE (wono varchar(10),transferDate date
,fromWC varchar(10),toWC varchar(10),qty float)
INSERT INTO @transactionTable
SELECT '0000000123','5/10/2018','STAG','PP-B',10
UNION
SELECT '0000000123','5/11/2018','PP-B','PP-T',5
UNION
SELECT '0000000123','5/11/2018','PP-T','TEST',3
UNION
SELECT '0000000123','5/12/2018','PP-B','PP-T',5
UNION
SELECT '0000000123','5/12/2018','PP-T','TEST',5
UNION
SELECT '0000000123','5/13/2018','PP-T','TEST',2
UNION
SELECT '0000000123','5/13/2018','TEST','FGI',8
UNION
SELECT '0000000123','5/14/2018','TEST','FGI',2
SELECT *,
fromTotal = -SUM(qty) OVER(PARTITION BY fromWC ORDER BY wono, transferdate, fromWC),
toTotal = SUM(qty) OVER(PARTITION BY toWC ORDER BY wono, transferdate, toWC)
FROM @transactionTable
ORDER BY wono, transferDate, fromWC
我想在每次交易后获得 fromWC 和 toWC 的 运行ning 余额。
根据上面的记录,最终结果应该是这样的:
我相信可以使用SUM(qty) OVER(PARTITION BY...
,但我不确定如何写语句。当我尝试增加和减少时,每一行总是结果为 0。
如何编写 SUM
语句来达到预期的结果?
更新
此图显示每笔交易、生成的 WC 数量,并突出显示每笔交易对应的 from
和 to
工作中心。
比如5/11看第二条记录,3条从PP-T转移到TEST。交易后PP-B有5个,PP-T有2个,TEST有3个
我可以接近,除了起始余额:
SELECT wono, transferDate, fromWC, toWC, qty,
SUM( CASE WHEN WC = fromWC THEN RunningTotal ELSE 0 END ) AS FromQTY,
SUM( CASE WHEN WC = toWC THEN RunningTotal ELSE 0 END ) AS ToQTY
FROM( -- b
SELECT *, SUM(Newqty) OVER(PARTITION BY WC ORDER BY wono,transferdate, fromWC, toWC) AS RunningTotal
FROM(-- a
SELECT wono, transferDate, fromWC, toWC, fromWC AS WC, qty, -qty AS Newqty, 'From' AS RecType
FROM @transactionTable
UNION ALL
SELECT wono, transferDate, fromWC, toWC, toWC AS WC, qty, qty AS Newqty, 'To' AS RecType
FROM @transactionTable
) AS a
) AS b
GROUP BY wono, transferDate, fromWC, toWC, qty
我的逻辑假设所有余额都从 0 开始,因此 "STAG" 余额将为 -10。
查询的工作原理:
- "Unpivot" 将输入记录设置为 "From" 和 "To" 记录,并为 "From" 记录取反数量。
- 计算每个 "WC" 的 运行 总数。
- 将 "Unpivoted" 记录合并回原始形状
解决方案 2
WITH CTE
AS(
SELECT *,
ROW_NUMBER() OVER( ORDER BY wono, transferDate, fromWC, toWC ) AS Sequence
FROM @transactionTable
),
CTE2
AS(
SELECT *,
fromTotal = -SUM(qty) OVER(PARTITION BY fromWC ORDER BY Sequence),
toTotal = SUM(qty) OVER(PARTITION BY toWC ORDER BY Sequence)
FROM CTE
)
SELECT a.Sequence, b.Sequence, c.Sequence, a.wono, a.transferDate, a.fromWC, a.toWC, a.qty, a.fromTotal + ISNULL( b.toTotal, 0 ) AS FromTotal, a.toTotal + ISNULL( c.fromTotal, 0 ) AS ToTotal
FROM CTE2 AS a
OUTER APPLY( SELECT TOP 1 * FROM CTE2 WHERE wono = a.wono AND Sequence < a.Sequence AND toWC = a.fromWC ORDER BY Sequence DESC ) AS b
OUTER APPLY( SELECT TOP 1 * FROM CTE2 WHERE wono = a.wono AND Sequence < a.Sequence AND fromWC = a.toWC ORDER BY Sequence DESC ) AS c
ORDER BY a.Sequence
注意:此解决方案将从 "ID" 列中受益匪浅,它反映了交易顺序,或者至少您需要 wono, transferDate, fromWC, toWC
[ 上的索引=13=]