column必须出现在postgresql中的group by子句错误中

时间:2016-11-30 07:10:38

标签: sql postgresql

我知道这是postgresql中的一个常见问题但我在stackoverflow上尝试了很多解决方案,但没有得到结果,这就是为什么我在SO上发布这个问题。

这是我在phpPGAdmin查询浏览器上运行的查询。

{{1}}

如果我使用group by子句这个查询不起作用但如果我没有groupby运行它然后它工作,不知道原因是什么,我通常在mysql中工作,这是我在postgresql中的第一个查询,它在mysql中运行良好。

错误是

  

错误:列" ma_global.target_nation"必须出现在GROUP BY中   子句或用于聚合函数LINE 4:target_nation,   acquiror_nation,

2 个答案:

答案 0 :(得分:1)

GROUP BY子句允许在SELECT子句中混合普通列和聚合列,其中GROUP BY必须包含非聚合的所有结果列。为了使您的陈述正确,您也可以将target_nation, acquiror_nation, rank_value, rank_date放入GROUP BY子句中。但删除此子句会更容易,因为您没有聚合。如果您获得重复的行,则应在DISTINCT子句中添加SELECT

SELECT DISTINCT target_financial_advisor,
    acquiror_finanial_advisor,
    target_nation,
    acquiror_nation,
    rank_value,
    rank_date
FROM ma_global
WHERE target_nation = 'France'
    AND acquiror_nation = 'France'
    AND EXTRACT(YEAR
        FROM "rank_date") = 2013
    AND rank_date IS NOT NULL
LIMIT 50;

答案 1 :(得分:1)

我不确定你想要达到什么目标,因为你有2列选择和2列分组......这个糟糕的老帖子'我不知道你要对其他4列做什么...如果你按所有列使用group必须出现在group by或某些聚合函数中。如果您对这四列中的内容不感兴趣(或者您知道它们在WHERE子句中),请从select ...它的基本SQL规则中删除它。

这将有效:

SELECT target_financial_advisor,
   acquiror_finanial_advisor,
   target_nation,
   acquiror_nation,
   rank_value,
   rank_date
FROM ma_global
WHERE target_nation = 'France'
   AND acquiror_nation = 'France'
   AND EXTRACT(YEAR
          FROM "rank_date") = 2013
   AND rank_date IS NOT NULL
GROUP BY 1,2,3,4,5,6 LIMIT 50;

或者如果省略WHERE子句中的列:

SELECT target_financial_advisor,
   acquiror_finanial_advisor,
   rank_value
FROM ma_global
WHERE target_nation = 'France'
   AND acquiror_nation = 'France'
   AND EXTRACT(YEAR
          FROM "rank_date") = 2013
   AND rank_date IS NOT NULL
GROUP BY 1,2,3 LIMIT 50;