簡體   English   中英

根據同一行中的行值逐行更新列值

[英]Update column value based on row value in the same row, row by row

我有一個帶有memberIDDate的表,如下所示:

MEM_ID          DATE        ttl_sales
-------------------------------------
19960124000007  2020-01-19  NULL
19960131001079  2020-01-20  NULL
19960203001249  2020-01-07  NULL
19960205000213  2020-01-14  NULL

我需要從sales_table更新ttl_sales ,條件是使用同一行的MEM_ID和同一行的DATE之前發生的事務。

以后可能需要用到類似的function,但是條件比較復雜(在給DATE plus之前在某些商店交易,用某些產品等),所以歡迎相關關鍵字和解決方案。

我正在使用 SQL 服務器。

謝謝你。

最簡單的方法是協調一個子查詢,根據成員 mem_id 對 sales 中的行求和:

UPDATE members
SET ttl_sales = (
  SELECT sum(s.amount) 
  FROM sales s 
  WHERE s.sale_date < members.[date] and s.mem_id = members.mem_id
)

我假設 ttl_sales 是銷售總額。 如果是計數,請使用COUNT(*)而不是SUM(amount)

您可以向 WHERE 添加更多子句以容忍您對產品、商店等的要求

在 SQL 服務器中,您可以使用可更新的 CTE 和 window 函數。 例如,如果您想要累積數字,您可以使用row_number()

with toupdate as (
      select t.*,
             row_number() over (partition by memberId order by date) as seqnum
      from t
     )
update toupdate
     set ttl_sales = seqnum;

Window 功能非常靈活,所以他們大概可以為所欲為。

您還可以使用包含帶有INNER JOINSUM聚合的子查詢的公用表表達式:

WITH s AS
(
 SELECT s.Mem_ID AS Mem_ID_s, 
        SUM( COALESCE(s.ttl_sales,0) ) AS ttl_sales_s
   FROM sales s
   JOIN members m 
     ON m.Mem_ID = s.Mem_ID
  WHERE s.Date < m.Date
  GROUP BY s.Mem_ID
)
UPDATE m
   SET m.ttl_sales = s.ttl_sales_s
  FROM members as m
  INNER JOIN s 
     ON m.Mem_ID = s.Mem_ID_s;

另請注意,對於ttl_sales列的NULL值的情況,使用COALESCE() function 很重要。

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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