【问题标题】:Querying the same table in the where clause在where子句中查询同一张表
【发布时间】:2019-05-08 23:32:05
【问题描述】:
SELECT

M.Id_x as Id 
max(case when SA.TYP = 'CHRG' then    SA.AMT end)  CHRG,

max(case when SA.TYP = 'NTCV' then SA.AMT end) NC,

max(case when SA.TYP = 'COV' then SA.SRC end) COV

FROM database.tableA M
LEFT OUTER JOIN  
database.tableB SA

On
(SA.Id_x = M.id_x
AND SA.date = m.date
AND SA.SRC=M.SRC)

Where M.date >= '2018-01-01'
And m.src = 'ox'
And sa.type IN ('CHRG', 'NTCV', 'COV')

Group by 
M.id_x 
M.date

已知 NTCV/COV 可以 = '?'或数值

背景 我在参数时使用 max case 的原因是为了研究数据库如何将每个 Id 与一个类型相关联,并且每个类型可能有也可能没有数值。我不希望数据有这么多行,因为有其他表加入。为简单起见,我只显示这 2 个。此外,当参数允许数据作为一行而不是多行时的最大情况。

问题 有时我可能需要查询 NTVC = COV 的多个场景,但我不确定如何在 where 子句中进行查询。如果我尝试这样写它会给我一个错误。如果我尝试调用同一张表 3 次,那么它会使用大量 CPU 和线轴。

我很感兴趣您将如何重写此查询以完成

其中 ntvc = cov 表示有时 1m 行的预期结果

使用的技术:teradata sql assistant

【问题讨论】:

  • 您通常按您选择的列进行分组,除了那些作为设置函数的参数的列。
  • WHERE 子句中的那个 sa 条件使得左连接返回常规的内连接结果。要获得真正的左连接结果,请将条件移至 ON 子句。
  • 请提供样本数据和期望的结果。我无法理解你对你想要什么的解释。例如,我不知道这是什么意思:“Known NTCV/COV can = '?'或数值”。

标签: sql case where-clause teradata-sql-assistant


【解决方案1】:

我猜你想要一个HAVING 子句,而不是WHERE 子句,带有:

having (max(case when SA.TYP = 'NTCV' then SA.AMT end) = 
        max(case when SA.TYP = 'COV' then SA.SRC end) 
       )

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 2020-08-18
    • 1970-01-01
    • 2014-12-01
    • 2017-12-10
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多