我如何做多个 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;
我有一组数据,我需要根据一个特定列中的记录手动调整特定行后面的行的列(插入 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;