【问题标题】:Teradata - Cannot nest aggregate operations with caseTeradata - 不能用案例嵌套聚合操作
【发布时间】:2020-05-15 03:43:07
【问题描述】:

我正在尝试运行以下查询:

select BI_NROCTA,
MAX(CASE WHEN FECHA_REGISTRO='2019-12-01' THEN COUNT(TRAMO) ELSE 0 END) "2019-12-01",
MAX(CASE WHEN FECHA_REGISTRO='2019-12-02' THEN COUNT(TRAMO) ELSE 0 END) "2019-12-02",
MAX(CASE WHEN FECHA_REGISTRO='2019-12-03' THEN COUNT(TRAMO) ELSE 0 END) "2019-12-03"

from DL_RG_ANALYTICS.SH_MORA_OSC_2 
WHERE BI_NROCTA='0004890702108691953'
GROUP BY BI_NROCTA,TRAMO,FECHA_REGISTRO

但是查询错误: 不能嵌套聚合操作。

我应该使用其他查询类型吗?

【问题讨论】:

  • 你应该解释你想要完成的逻辑。并提供样本数据和期望的结果。
  • 正如 Gordon 所写:您到底想计算什么,您的 GROUP BY 令人困惑?

标签: sql teradata teradata-sql-assistant


【解决方案1】:

我很确定你想要这样的条件聚合:

select BI_NROCTA, TRAMO,
       SUM(CASE WHEN FECHA_REGISTRO = '2019-12-01' THEN 1 ELSE 0 END) as "2019-12-01",
       SUM(CASE WHEN FECHA_REGISTRO = '2019-12-02' THEN 1 ELSE 0 END) as "2019-12-02",
       SUM(CASE WHEN FECHA_REGISTRO = '2019-12-03' THEN 1 ELSE 0 END) as "2019-12-03"
from DL_RG_ANALYTICS.SH_MORA_OSC_2 
WHERE BI_NROCTA = '0004890702108691953'
GROUP BY BI_NROCTA, TRAMO;

这会计算每个日期的记录。

【讨论】:

  • 你是对的,但我需要每天计算“tramo”而不是“then 1”
  • 如果我将“then 1”更改为“then count(tramo)”,则会出现“无法嵌套聚合操作”的相同错误
  • tramo 列有 3 个范围,这就是为什么我需要放置“tramo”而不仅仅是 1 :/
  • 那么您可能需要一个派生表来进行计数,然后在外部查询中求和,尽管我不确定我是否理解您的目标。
  • @Sebastián 。 . .将tramo 放入group by,这样计数就在不同的行上。
【解决方案2】:

如果您希望按日期 (FECHA_REGISTRO) 获取计数,您可以执行以下操作:

select FECHA_REGISTRO, COUNT(TRAMO)
from DL_RG_ANALYTICS.SH_MORA_OSC_2 
where BI_NROCTA='0004890702108691953'
and FECHA_REGISTRO in ('2019-12-01','2019-12-02','2019-12-03')
group by FECHA_REGISTRO

我从group by 中取出BI_NROCTA,因为您只在where 子句中查看一个值。

更新
这将得到TRAMO 的不同值的结果:

select FECHA_REGISTRO, TRAMO, COUNT(*)
from DL_RG_ANALYTICS.SH_MORA_OSC_2 
where BI_NROCTA='0004890702108691953'
and FECHA_REGISTRO in ('2019-12-01','2019-12-02','2019-12-03')
group by FECHA_REGISTRO, TRAMO

【讨论】:

  • 如果我想显示每个“tramo”,tramo 有 3 个不同的部分?
  • 没问题,只需将额外字段添加到您的selectgroup by。请参阅上面的更新答案。
【解决方案3】:

这就是你要找的吗?

select
BI_NROCTA,
max("2019-12-01"),
...
from
(
select
BI_NROCTA,
count (CASE WHEN FECHA_REGISTRO='2019-12-01' THEN (TRAMO) ELSE null END) as "2019-12-01",
...
from DL_RG_ANALYTICS.SH_MORA_OSC_2 
WHERE BI_NROCTA='0004890702108691953'
GROUP BY BI_NROCTA --other group by columns not needed
) t
group by
BI_NROCTA

【讨论】:

  • 谢谢!很有用
  • 如果这是您所追求的,请注意不需要外部查询。内部查询已经执行group by BI_NROCTA
  • OP 的原始查询没有多大意义,我只是想展示如何进行这两个聚合。
猜你喜欢
  • 2014-06-25
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 2019-03-13
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多