![](/img/trans.png)
[英]Update Value in the Column based on another value in the same column for different row
[英]Update column value based on row value in the same row, row by row
我有一個帶有memberID
和Date
的表,如下所示:
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 JOIN
和SUM
聚合的子查詢的公用表表達式:
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.