sql - 如何为给定的主键在两列中执行少量计算
问题描述
查询根据其他贡献者的要求进行编辑。提前非常感谢。对于给定的主键 (id_pk),我们假设以下是值:
1. id_pk | code_col| amt_col
2. abc | 10 | 1000
3. abc | 11 | 5
4. abc | 12 | 10
5. abc | 13 | 20
现在,我需要检查对于给定的名为“abc”的主键,在“code_col”列下是否存在名为“10”的值。如果满足此条件,则需要执行以下操作:
- 对于同一个主键abc,对于code_col值为11,从amt_col值为10(即1000)中减去amt_col值(即5)。所以最终值是0应该在上表的第二行更新。
- 对于同一个主键abc,对于code_col值为12,从amt_col值为10(即1000)中减去amt_col值(即10)。所以最终值是0应该更新在上表的第三行。
- 对于同一个主键abc,对于code_col值为13,从amt_col值为10(即1000)中减去amt_col值(即20)。所以最终值是-865(剩余的)应该在上表的第四行/最后一行更新。
结果应如下所示:
1. id_pk | col1| col2
2. abc | 10 | 0
3. abc | 11 | 0
4. abc | 12 | 0
5. abc | 13 | -965
希望这很清楚。我需要在 Teradata 中实现此验证(也欢迎查询 / 光标 / StoredProcedure / 宏 / 任何其他内容。
如果文本显得如此粗体,请在 Notepad++ 中复制粘贴内容,因为我在这里使用相同的内容。
解决方案
这是您可以转换为 Teradata 语法的一般逻辑。
SELECT id_pk,
code_col col1,
CASE
WHEN code_col = 13 THEN (Sum_10 - Sum_Other)
ELSE 0
END col2
FROM your_table A
LEFT JOIN
(
SELECT id_pk,
SUM(CASE WHEN code_col = 10 THEN amt_col ELSE NULL END) Sum_10,
SUM(CASE WHEN code_col <> 10 THEN amt_col ELSE NULL END) Sum_Other
FROM your_table
GROUP BY id_pk
)B ON A.id_pk = B.id_pk
或者,您也可以尝试以下逻辑 -
SELECT
A.id_pk,
A.code_col col1,
CASE
WHEN A.code_col = 13 THEN
(SELECT amt_col FROM your_table WHERE code_col = 10 AND id_pk = A.id_pk)
-
(SELECT SUM(amt_col) FROM your_table WHERE code_col <> 10 AND id_pk = A.id_pk)
ELSE 0
END col2
FROM your_table A
推荐阅读
- security - 如何隐藏第三方网站的技术堆栈以了解我们的网站开发?
- python - 使用命令行 pyrcc 在 PyQt5 中编译 .qrc 文件时出现“没有可用的代码对象”错误
- javascript - 我在 vuejs 中的对象数组中舍入数字
- file - Flutter pod 文件问题
- python - 避免来自同一用户的重复输入
- git - 在没有完整克隆的情况下将文件放入 git repo
- c# - 使用数组的for循环范围
- git - 如何处理未跟踪的工作树文件中的 git pull 错误将被合并覆盖
- python-3.x - 数百个并行 dynamodb 查询
- android - 权限拒绝 -> 需要 oppo.permission.OPPO_COMPONENT_SAFE 但它已经在 AndroidManifest.xml 上