我如何做多个 CASE WHEN,使用 LEAD() 查看 SQL 中的整行?

How do I do multiple CASE WHEN, using LEAD() to look at an entire row in SQL?

我有一组数据,我需要根据一个特定列中的记录手动调整特定行后面的行的列(插入 0)。例如:

我想要的输出:

TYPE ObjectID DATE AMT1 AMT2 AMT3 AMT4 TOTAL AMT
C 1234 3/1 2 0 2 2 4
A 1234 3/2 5 0 0 0 3
B 1234 3/3 2 0 2 3 0

查看 TYPE 列,仅当当前行的类型为 'A', 我想要下面 AMT2 列中的任何内容 它将填充到该行的总 AMT 列中。如果 AMT2 列中的金额为 0,那么我需要 AMT4 列中的金额。否则,我希望 TOTAL AMT 列是 AMT1 和 AMT3 的总和。然后最重要的是,我需要 TOTAL AMT 列将 0 硬编码到 below TYPE 'A' 行(而不是对 AMT1 和 AMT3 求和)。

我使用 LEAD() 函数来处理问题的第一部分(从 AMT2 中检索 TOTAL AMT 列的值),但我正在努力解决如何在另一个 CASE WHEN (如果这甚至是正确的方法),这将使我能够获得 AMT4 并为所需的特定行硬编码 0。非常感谢任何帮助!

这是我用来从下一行检索 AMT2 的代码:

CASE WHEN TYPE = 'A' THEN LEAD(AMT2, 1) OVER (PARTITION BY ObjectID ORDER BY DATE ASC)      
     ELSE (AMT1 + AMT3)
END AS TOTAL AMT

您可以使用铅和大小写来完成 (result here)

select *,case type when 'A' then lead(amt2,1) over (partition by objectid order by date) else amt1+amt3 end as total
from t1

看来您只需要一个嵌套的 case 表达式:

case when 
  type = 'A' then 
    lead(AMT2) over (partition by ObjectID order by DATE)      
else 
  case when lag(type) over (partition by ObjectID order by DATE)='A' then 
    0 
  else
    AMT1 + AMT3 
  end
end as TOTALAMT;

Demo Fiddle