簡體   English   中英

根據 sql 選擇查詢 C# 的結果更新表列的最佳方法是什么?

[英]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

此外:

  • 第二個 CTE 是不必要的,可以折疊成第一個。
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM