查询是根据其他贡献者的要求编辑的。提前谢谢。对于给定的主键(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‘的值。如果此条件满足,则需要执行以下操作:
结果如下:
1. id_pk | col1| col2
2. abc | 10 | 0
3. abc | 11 | 0
4. abc | 12 | 0
5. abc | 13 | -965希望这是清楚的。我需要在Teradata中实现这个验证(Query / Cursor / StoredProcedure /宏/任何其他的东西也是受欢迎的。
如果文本显示得如此粗体,请复制粘贴在Notepad++中的内容,就像我在这里发布的内容一样。
发布于 2019-07-08 18:08:00
因为这里有一些不明确的地方( 1000是从哪里来的),(为什么跳过第一个记录),等等。以下是一个快速计算累积金额的方法,它能让你大致了解到:
SELECT id_pk,
col1,
0 AS col2,
-1000 + SUM(SUM(col2)) OVER (PARTITION BY id_pk ORDER BY col1 ROWS UNBOUNDED PRECEDING) AS col3
FROM t1
GROUP BY id_pk, col1, col2发布于 2019-07-09 10:43:07
这似乎符合您的要求:
SELECT id_pk, code_col
,CASE
WHEN code_col = Max(code_col) Over (PARTITION BY id_pk) -- "last" row?
THEN -- negative code 10 amount
Max(CASE WHEN code_col = 10 THEN -amt_col*2 end) Over (PARTITION BY id_pk)
-- plus the sum of all other amounts
+ Sum(amt_col) Over (PARTITION BY id_pk)
ELSE 0
END
FROM tab
QUALIFY -- only ids with a code 10
Max(CASE WHEN code_col = 10 THEN code_col end) Over (PARTITION BY id_pk) = 10发布于 2019-07-09 11:18:17
这是一个通用逻辑,您可以将其转换为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 Ahttps://stackoverflow.com/questions/56939796
复制相似问题