【问题标题】:GROUP BY column present in only one table in case of JOIN (using two tables)在 JOIN 的情况下,GROUP BY 列仅出现在一个表中(使用两个表)
【发布时间】:2018-08-05 13:00:53
【问题描述】:

这给出了一个错误:

SELECT 
    customerName, customerNumber, SUM(amount)
FROM
    customers
        LEFT JOIN
    payments USING (customerNumber)
GROUP BY customers.customerName
ORDER BY customerName;

但是 'GROUP BY customers.customerNumber' 给出了正确的结果。

注意:两个表中都存在“customerNumber”,但没有“customerName”。

表“客户”的列:

customerNumber int(11) **PK** 
customerName varchar(50) 
contactLastName varchar(50) 
contactFirstName varchar(50)

表格“付款”的列:

customerNumber int(11) **PK** 
checkNumber varchar(50) **PK** 
paymentDate date 
amount decimal(10,2)

这是一个约束,我们可以在 JOIN 的情况下对两个表中都存在的列进行 GROUP BY 吗?

【问题讨论】:

  • 您期望在输出中得到什么?简而言之,您可能会执行类似 SELECT...customerNumner, IFNULL(customerName, 'UNKNOWN').... 这样的操作,那么至少您将拥有 customerName 字段的值。
  • 我期待:customerName、customerNumber、SUM(amount) 并在 'customers' 上使用 LEFT JOIN,因此 customerName 中的记录不能为 NULL。

标签: mysql sql


【解决方案1】:

没有这样的限制。我会(通常)建议在 GROUP BY 子句中包含所有未聚合的列:

GROUP BY customerName, customerNumber

(你应该使用别名,但这与这个问题无关。)

SQL,一般来说,需要这个。除了一个例外。如果一个(或多个)列是唯一的或主键,那么您可以这样做:

SELECT c.*                 -- any or all the columns
. . .
GROUP BY c.customerNumber  -- unique or primary key

这就解释了为什么这个公式有效。但是,customerName 既不是unique 也不是primary key,所以这是一个错误。

注意:旧版本的 MySQL 没有施加此约束,因此您可以在 GROUP BYSELECT 子句中放置任何内容以进行聚合查询。

【讨论】:

    【解决方案2】:

    你的问题

    这是一个约束,我们可以在 JOIN 的情况下对两个表中都存在的列进行 GROUP BY 吗? 答:不,没有这样的规定

    我认为下面对你有用,聚合函数的规则是你投影的列数也必须在group by

    SELECT 
            c.customerName, c.customerNumber, SUM(amount)
        FROM
            customers c
                LEFT JOIN
            payments p on c.customerNumber=p.customerNumber
        GROUP BY c.customerName,c.customerNumber
        ORDER BY customerName;
    

    【讨论】:

    • 我已经说过,当您在 select 语句中选择两列但在 group by 子句中使用一列时,这就是原因
    • @AK你学了一些sql分组教程,你会得到更多
    • @AK 你可以通过输入聚合函数在谷歌中搜索很多网站会返回你知道详细信息的地方
    • 啊@AK你SUM本身就是聚合函数兄弟
    • @AK 这里 sum 是聚合函数,为此您使用 group by 子句,其他 2 列是投影列
    【解决方案3】:

    不,您可以在 Join 中的任何表的任何列上使用 Group By。不要求列必须出现在两个表中。

    GROUP BY customers.customerName 的错误是什么?

    【讨论】:

    • ** 这是错误:** 错误代码:1055。SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含与功能无关的非聚合列“classicmodels.customers.customerNumber”在 GROUP BY 子句中的列上;这与 sql_mode=only_full_group_by 不兼容
    • 试试 GROUP BY c.customerName, c.customerNumber
    • 还可以考虑更改 sql_mode。在这里阅读:rejahrehim.com/blog/mysql/osx/fix/2016/12/15/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多