在此输入图像描述 附件是我的桌子。有人可以帮忙吗?我正在寻找更新列值。 对于每个item_id并基于agreem_id A,我想更新term-0,12,24,36。当 Agreem_id 更改为 B 时,它应该仅更新 0,12,24。
我尝试使用cte
with cte as
(select 0 n
union all
select n + 12 from cte where n < 36
)
select * from cte
但是当agreem_id改变时这不会改变
[在此处输入图像描述][2]
要根据
TERM
更新每个 ITEM_ID
的 AGREEM_ID
列,我们可以使用公共表表达式 (CTE) 生成所需的 TERM
值,然后执行 UPDATE
操作。 CTE 将生成必要的项(AGREEM_ID
A 为 0、12、24、36,AGREEM_ID
B 为 0、12、24),并且 UPDATE
会将这些项分配给相应的行。
下面是实现此目的的 SQL 脚本:
-- Create the CTE to generate the terms
WITH CTE_Terms AS (
SELECT 0 AS TERM, 'A' AS AGREEM_ID
UNION ALL
SELECT 12, 'A'
UNION ALL
SELECT 24, 'A'
UNION ALL
SELECT 36, 'A'
UNION ALL
SELECT 0, 'B'
UNION ALL
SELECT 12, 'B'
UNION ALL
SELECT 24, 'B'
)
-- Update the main table based on the CTE
UPDATE main_table
SET TERM = CTE_Terms.TERM
FROM your_table_name AS main_table
JOIN (
SELECT
ITEM_ID,
AGREEM_ID,
TERM,
ROW_NUMBER() OVER (PARTITION BY ITEM_ID, AGREEM_ID ORDER BY (SELECT NULL)) AS RowNum
FROM CTE_Terms
) AS CTE_Terms
ON main_table.ITEM_ID = CTE_Terms.ITEM_ID
AND main_table.AGREEM_ID = CTE_Terms.AGREEM_ID
AND main_table.RowNum = (
SELECT COUNT(*)
FROM your_table_name AS mt
WHERE mt.ITEM_ID = main_table.ITEM_ID
AND mt.AGREEM_ID = main_table.AGREEM_ID
AND mt.TERM IS NOT NULL
) + 1;
-- Verify the results
SELECT * FROM your_table_name;
CTE_条款:
TERM
生成所需的 AGREEM_ID
值。TERM
A 的 AGREEM_ID
值 (0, 12, 24, 36) 创建行,为 AGREEM_ID
B 创建 (0, 12, 24) 行。更新声明:
UPDATE
语句将主表与CTE连接起来。ROW_NUMBER
窗口函数用于为每个ITEM_ID
和AGREEM_ID
对生成行号。RowNum
用于确保为每行分配正确的 TERM
值。验证:
SELECT
语句用于验证更新后的表。请将
your_table_name
替换为您的桌子的实际名称。
此脚本假设表结构和数据类型与提供的图像和描述中显示的一致。可能需要根据确切的架构和要求进行调整。