首页 > 解决方案 > 聚合嵌套 Pgsql 查询

问题描述

我正在尝试查询一个表以获得一些结果,但是我这样做的方式给了我错误:错误:不能嵌套聚合函数调用。

该表如下所示:

身份证 | 运河_c1 | 塔里法考 | 日期 | ativo_id

我正在尝试的查询是这样的:

SELECT 
  SUM(case when tarifacao = 'ForaPonta' then canal_c1 else 0 end) as ConsForaPonta,
  MAX(case when tarifacao = 'ForaPonta' then canal_c1 else 0 end) as DemForaPonta,
  ativo_id as ativo_id,
  data_leitura_inicio::date as date
FROM
  medicao
WHERE
  medicao.ativo_id in (45) AND 
  medicao.tipo_leitura = 'Consumo' AND 
  medicao.data_leitura_inicio >= '2017-01-01' AND 
  medicao.data_leitura_inicio < '2017-01-10'
GROUP BY
  medicao.ativo_id,
  medicao.data_leitura_inicio::date

这给了我这样的结果: 查询结果 我现在需要的是来自 DemForaPonta 字段的日期时间,为了做到这一点,我尝试了这个,但是得到了那个错误。

 MAX(case when tarifacao = 'ForaPonta' and 
 canal_c1 = MAX(case when tarifacao = 'ForaPonta' then canal_c1 else 0 end)
 then data_leitura_inicio end) as DateDemForaPonta

你知道我怎么能做到这一点吗?谢谢。

编辑:这是一个示例,查询结果是预期结果。 例子

标签: postgresqlnested

解决方案


有一个真实数据的例子会很有帮助。但无论如何,您可以使用嵌套选择以及其他选项来做您需要的事情。

嵌套选择

SELECT *,
  MAX(case when tarifacao = 'ForaPonta' and canal_c1 = DemForaPonta then data_leitura_inicio END)
  AS DateDemForaPonta
FROM(
    SELECT
      SUM(case when tarifacao = 'ForaPonta' then canal_c1 else 0 end) as ConsForaPonta,
      MAX(case when tarifacao = 'ForaPonta' then canal_c1 else 0 end) as DemForaPonta,
      ativo_id as ativo_id,
      data_leitura_inicio::date as date
    FROM
      medicao
    WHERE
      medicao.ativo_id in (45) AND 
      medicao.tipo_leitura = 'Consumo' AND 
      medicao.data_leitura_inicio >= '2017-01-01' AND 
      medicao.data_leitura_inicio < '2017-01-10'
    GROUP BY
      medicao.ativo_id,
      medicao.data_leitura_inicio::date
)data

因为我没有数据来测试它,所以真的不知道它是否有效,但它应该。


推荐阅读