列“ic.inscount”必须出现在 GROUP BY 子句中或在聚合函数中使用

Posted

技术标签:

【中文标题】列“ic.inscount”必须出现在 GROUP BY 子句中或在聚合函数中使用【英文标题】:column "ic.inscount" must appear in the GROUP BY clause or be used in an aggregate function 【发布时间】:2016-09-22 03:02:18 【问题描述】:

当我运行这个查询时

 WITH install_count_join_date AS (
  SELECT 
    date_trunc('month', join_date) AS date, 
    COUNT(*) AS "inscountjoin"
  FROM 
    apps202_prod.search 
  WHERE 
    join_date >= '2016-06-01'
  AND
    app_id = 3
  GROUP BY 
    date_trunc('month', join_date)
), install_count AS (
  SELECT
    DATE(original_timestamp) AS date,
    COUNT(*) AS "inscount"
  FROM 
    apps202_prod.search 
  WHERE 
    original_timestamp >= '2016-06-01'
  AND
    app_id = 3
  GROUP BY 
    DATE(original_timestamp)
) 

SELECT 
  date_trunc('month', mr.date) AS "money_revenue_date",
  SUM(mr.amount) AS "amt",
  ic.inscount AS "install_count"
FROM 
  mysql_apps202_prod.apps202_prod_money_revenue mr
  join install_count ic on date_trunc('month', ic.date) = date_trunc('month', mr.date)
WHERE
  date_trunc('month', mr.date)  >= '2016-06-01'
AND
  mr.app_id = 3

GROUP BY
  date_trunc('month', mr.date)

我收到此错误:

列 ic.inscount 必须出现在 GROUP BY 子句中或用于聚合函数中

【问题讨论】:

这个错误很容易解释...由于您的最终查询使用聚合 (sum),您需要将其他字段添加到 group by 子句... 我不需要将 inscount 添加到 group by 因为我已经在 with 子句中聚合了它,正如您在上面的代码中看到的那样 您正在对外部查询中的 amount 列求和。所以是的,你必须再次使用group by(对于两个字段)...... 当我将 inscount 放在 groupby 子句中时,它给了我很多记录,预期结果只有 4 条记录,因为主查询中的 where 子句是 date_trunc('month', mr.date) > = '2016-06-01' 此时,表结构、样本数据和预期结果会有所帮助。您的第一个 common table expression 没有被使用,我不完全确定您要做什么。您最好删除这篇文章并重新发布您的实际问题(与我已经评论过的错误相比)。 【参考方案1】:

您必须如下更改您的选择语句,因为您在上面收到了很多关于您正在处理的问题的反馈,如果您使用的是 group by,那么您选择除了 group by 之外的所有具有聚合功能的列。在您的情况下,ic.inscount 既不在 group by 也不使用任何聚合函数,因此请根据您的要求使用以下之一。

SELECT 
   date_trunc('month', mr.date) AS "money_revenue_date",
   SUM(mr.amount) AS "amt",
   ic.inscount AS "install_count"
FROM mysql_apps202_prod.apps202_prod_money_revenue mr
join install_count_join_date ic on date_trunc('month', ic.date) = date_trunc('month', mr.date)
WHERE date_trunc('month', mr.date)  >= '2016-06-01'
    AND mr.app_id = 3
GROUP BY date_trunc('month', mr.date), ic.inscount

SELECT 
    date_trunc('month', mr.date) AS "money_revenue_date",
    SUM(mr.amount) AS "amt",
    MAX(ic.inscount) AS "install_count" --Any Addregate Function
FROM mysql_apps202_prod.apps202_prod_money_revenue mr
join install_count_join_date ic on date_trunc('month', ic.date) = date_trunc('month', mr.date)
WHERE date_trunc('month', mr.date)  >= '2016-06-01'
    AND mr.app_id = 3
GROUP BY date_trunc('month', mr.date)

【讨论】:

出现错误“关系“install_count”不存在” 您错过了在查询中使用的 CTE,所以让我来解决这个问题,如果我没记错的话,您想使用 CTE 全名“install_count_join_date”,而不仅仅是“install_count”。尝试使用上面的更新代码

以上是关于列“ic.inscount”必须出现在 GROUP BY 子句中或在聚合函数中使用的主要内容,如果未能解决你的问题,请参考以下文章

GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用

仅休眠错误:“列必须出现在 GROUP BY 子句中或在聚合函数中使用”

Django 与 Postgresql,列必须出现在 GROUP BY 子句中或在聚合函数中使用

Postgresql“列必须出现在 GROUP BY 子句中或在聚合函数中使用”和唯一字段

AWS Redshift 列“view_table_B.cost”必须出现在 GROUP BY 子句中或用于聚合函数

Hibernate 列“user1_.user_id”必须出现在 GROUP BY 子句中或在聚合函数中使用