![](/img/trans.png)
[英]C# SQL -What is the best way to INSERT or SELECT text to or from a db table with line breaks
[英]What is the best way to update a table column based on a result of a sql select query C#?
原始查詢:
with Tr As (
SELECT
DocDtls.Warehouse,
Transactions.Code,
DocDtls.zDate,
Transactions.ID,
Transactions.QtyIn,
Transactions.QtyOut,
Transactions.BalanceAfter
FROM
DocDtls
INNER JOIN Transactions ON DocDtls.[PrimDocNum] = Transactions.[DocNum]
),
formatted_tr as (
select
ID,
Code,
QtyIn,
QtyOut,
BalanceAfter,
LAG(BalanceAfter, 1, 0) Over (
partition by Warehouse,
Code
order by
Code,zDate,ID
) Prev_BlncAfter
from
Tr
)
select ID,Code,QtyIn,QtyOut,BalanceAfter
,SUM(Prev_BlncAfter + QtyIn)-QtyOut As NewBlncAfter
from formatted_tr
group by ID,Code,QtyIn,QtyOut,BalanceAfter;
;
解釋這個想法:假設查詢返回項目X
的所有事務,結果有 10 行,我需要遍歷所有 10 行並設置BalanceAfter
(對於第一個事務QtyIn
- QtyOut
,任何其他事務(PreviousBalanceAfter
+ QtyIn)
QtyOut
) 等等。
我嘗試過的:我嘗試將查詢結果放入Datatable
中,然后使用DataView
再次過濾它以獲取DataGridView
當前行 ID 的NewBlncAfter
,因此Dataview
只有一行並將其保存在變量中 - 工作到目前為止,當我嘗試遍歷DataGridview
中的所有行並更新 BalanceAfter 時,我得到了:
必須聲明標量變量@Newblnc
你可以在這里找到整個代碼: 我的代碼
那么有沒有一種直接的方法可以將所有交易 BalanceAfter 更新為相等
編輯#1:我使用了@Charliface 查詢,結果是:
我使用舊查詢比較結果,每行的BalanceAfter
都應該等於NewBlncAfter
。
編輯#2:使用SUM
而不是LAG
導致計算錯誤,如果我多次使用查詢, BalanceAfter
中的結果會相乘
ID Code QtyIn QtyOut BalanceAfter
9 100001 20000 0 20000
14 100001 0 6000 40000
21 100001 3500 0 60000
24 100001 0 3000 80000
主要思想和期望的結果,例如:
ID Code QtyIn QtyOut BalanceAfter
9 100001 20000 0 20000
14 100001 0 6000 14000
21 100001 3500 0 17500
24 100001 0 3000 14500
公式為:對於第一筆交易QtyIn
- QtyOut
,任何其他交易(PreviousBalanceAfter
+ QtyIn)
- QtyOut
等等。
首先,我認為根本沒有理由將所有這些數據提取到 C# 中,然后逐行更新(這是非常低效的)。 您可以在單個批量更新中執行此操作。
目前尚不清楚您想要什么結果,但似乎您只想分配一個正在運行的SUM
計算,而不是LAG
。
此外:
OVER
中按同一列進行分區和排序是沒有意義的。GROUP BY
也沒有任何意義,而且看起來沒有必要,因為您是按主鍵分組的。WITH Tr AS (
SELECT
d.Warehouse,
t.Code,
d.zDate,
t.ID,
t.QtyIn,
t.QtyOut,
t.BalanceAfter,
SUM(t.QtyIn - t.QtyOut) OVER (
PARTITION BY d.Warehouse, t.Code
ORDER BY d.zDate, t.ID
ROWS UNBOUNDED PRECEDING
) BlncAfter
FROM
DocDtls d
INNER JOIN Transactions t ON d.PrimDocNum = t.DocNum
WHERE t.Code = @VariableCode
)
UPDATE Tr
SET BalanceAfter = BlncAfter;
最后一點:為什么要將這些信息存儲在一個新列中呢? 為什么不在需要時使用SUM OVER
計算它?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.