可以将聚合函数与连接一起使用吗?

Posted

技术标签:

【中文标题】可以将聚合函数与连接一起使用吗?【英文标题】:Can use aggregate functions with join? 【发布时间】:2020-08-13 03:50:57 【问题描述】: 表项目:pid(pk)、名称... 表类别:pid(pk)、project(project's pid)、parent(other category's pid) ... 表计数:项目(项目的 pid)、类别(类别的 pid)、计数 ...

我之前用过这个查询

SELECT
categories.*, projects.pid, projects.name, parent_category.*
FROM categories
INNER JOIN projects ON projects.pid = categories.project
LEFT JOIN categories AS parent_category ON parent_category.pid = categories.parent

效果很好

这一次我们需要 SUM, COUNT 个数据。所以我添加了“counts”表并进行了这个查询。

SELECT
categories.*, projects.pid, projects.name, SUM(counts.count), COUNT(counts.count),
parent_category.*, SUM(parent_category_count.count), COUNT(parent_category_count.count)
FROM categories
INNER JOIN projects ON projects.pid = categories.project
LEFT JOIN counts ON counts.category = categories.pid
LEFT JOIN categories AS parent_category ON parent_category.pid = categories.parent
LEFT JOIN counts AS parent_category_count ON parent_category_count.category = categories.pid

然后我得到

错误:聚合函数调用不能嵌套

我能做什么?这个查询基本上有意义吗?还是我应该拆分它?

【问题讨论】:

你错过了group by 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表格的代码的 SQL。 在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:***.com &标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。 【参考方案1】:

您应该添加一个适当的 GROUP BY 子句(在您的情况下应该是 categories.pid )

    SELECT
    categories.*
    , projects.pid
    , projects.name
    , SUM(counts.count)
    , COUNT(counts.count)
    , parent_category.*
    , SUM(parent_category_count.count)
    , COUNT(parent_category_count.count)
    FROM categories
    INNER JOIN projects ON projects.pid = categories.project
    LEFT JOIN counts ON counts.category = categories.pid
    LEFT JOIN categories AS parent_category ON parent_category.pid = categories.parent
    LEFT JOIN counts AS parent_category_count ON parent_category_count.category = categories.pid
    GROUP BY categories.pid 

或在您的评论中

    SELECT
    categories.*
    , projects.pid
    , projects.name
    , SUM(counts.count)
    , COUNT(counts.count)
    , parent_category.*
    , SUM(parent_category_count.count)
    , COUNT(parent_category_count.count)
    FROM categories
    INNER JOIN projects ON projects.pid = categories.project
    LEFT JOIN counts ON counts.category = categories.pid
    LEFT JOIN categories AS parent_category ON parent_category.pid = categories.parent
    LEFT JOIN counts AS parent_category_count ON parent_category_count.category = categories.pid
    GROUP BY categories.pid, projects.pid, parent_category.pid

【讨论】:

谢谢!在我的情况下,它是按 categories.pid、projects.pid、parent_category.pid 分组 答案已更新 .. 与您的小组通过 .. 如果我的答案是正确的或引导您找到正确的解决方案,请(过去 15 分钟)将其标记为已接受...请参阅此处@987654321 @

以上是关于可以将聚合函数与连接一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

GROUP BY 子句必须与聚合函数一起使用?

想要将多个聚合函数与雪花枢轴列函数一起使用

Oracle 的用户自定义聚合函数可以定义为与两列一起使用吗?

为啥不能再where语句中直接使用聚合函数

将 ROW_NUMBER() 与聚合函数一起使用

为啥聚合函数不能放在where后面?