Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何让MIN、MAX、AVG与innerjoin一起工作?_Mysql - Fatal编程技术网

Mysql 如何让MIN、MAX、AVG与innerjoin一起工作?

Mysql 如何让MIN、MAX、AVG与innerjoin一起工作?,mysql,Mysql,我需要从数据集中获得每个行业类型的平均值、最小值和最大值。当我使用MIN、MAX、AVG函数时,它只返回与Amount列相同的值 我的尝试 SQL标准要求GROUP BY子句包含所有不使用聚合函数的列,如min、max、avg等 SQL92和更早版本不允许查询包含select列表, “有条件”或“按列表排序”指的是 未在GROUP BY子句中命名。 然而,MySQL为GROUP实现了一个非标准的附加功能,在MySQL的旧版本中,它默认采用非标准方法。有一个服务器设置,您可以更改为从标准语法转换

我需要从数据集中获得每个行业类型的平均值、最小值和最大值。当我使用MIN、MAX、AVG函数时,它只返回与Amount列相同的值

我的尝试


SQL标准要求GROUP BY子句包含所有不使用聚合函数的列,如min、max、avg等

SQL92和更早版本不允许查询包含select列表, “有条件”或“按列表排序”指的是 未在GROUP BY子句中命名。

然而,MySQL为GROUP实现了一个非标准的附加功能,在MySQL的旧版本中,它默认采用非标准方法。有一个服务器设置,您可以更改为从标准语法转换为非标准语法进行分组。自MySQL 5.7.5以来,默认设置更改为SQL标准方法

MySQL 5.7.5及以上版本实现了功能依赖性检测。如果 默认情况下,仅启用了SQL模式下的_FULL_GROUP_, MySQL拒绝选择列表、有条件或 ORDER BY list指的是未在中命名的未聚合列 GROUP BY子句在功能上也不依赖于它们

见:

几乎可以肯定,您最初的查询不起作用的原因是出于上述考虑。许多人会告诉你,使用非标准方法是一种糟糕的做法,事实上,如果你进一步研究这个主题,你会发现非标准方法会为group by子句中未包含的所有列返回不确定的结果,但极少数情况除外。您最好始终使用标准方法。e、 g

SELECT
      c.IndustryType
    , o.OrderDate
    , AVG(o.Amount) AS "Average Amount"
    , MIN(o.Amount) AS "Minimum Amount"
    , MAX(o.Amount) AS "Maximum Amount"
FROM customer c
INNER JOIN orders o ON c.custid = o.custid
GROUP BY
      c.IndustryType
    , o.OrderDate
;

值得一提的是,您的原始查询似乎希望为IndustryType和OrderDate的每个唯一组合计算一个聚合,但需要在多行细节上重复这些聚合。有一些允许这种情况发生的窗口函数正在开发中,并打算与MySQL 8.x一起发布,这些函数已经存在于其他数据库中,例如DB2、Oracle、SQL Server、Postgre、SQL Lite、MariaDB等

窗口聚合的语法如下所示:

SELECT
      c.Custid
    , c.Cname
    , c.City
    , c.IndustryType
    , o.OrderNo
    , o.OrderDate
    , o.SalesPersonID
    , o.Amount
    , AVG(o.Amount) OVER(PARTITION BY c.IndustryType, o.OrderDate)
        AS "Average Amount" 
    , MIN(o.Amount) OVER(PARTITION BY c.IndustryType, o.OrderDate)
        AS "Minimum Amount"
    , MAX(o.Amount) OVER(PARTITION BY c.IndustryType, o.OrderDate)
        AS "Maximum Amount"
FROM customer c
INNER JOIN orders o ON c.custid = o.custid

删除第一行中除c.IndustryType之外的所有内容。同时从GROUP BY子句中删除o.orderdate。发布您的表定义和一些与您的表相关的示例数据集problem@PaulSpiegel,好吧,这很有效,但我不明白为什么它会破坏我的结果,我能显示结果中的所有字段id、姓名、城市等吗?对不起,我已经试着解释了,但我觉得我会写一份文件,即使是一个答案,也会很宽泛。所以请先阅读。
SELECT
      c.Custid
    , c.Cname
    , c.City
    , c.IndustryType
    , o.OrderNo
    , o.OrderDate
    , o.SalesPersonID
    , o.Amount
    , AVG(o.Amount) AS "Average Amount"
    , MIN(o.Amount) AS "Minimum Amount"
    , MAX(o.Amount) AS "Maximum Amount"
FROM customer c
INNER JOIN orders o ON c.custid = o.custid
GROUP BY
      c.Custid
    , c.Cname
    , c.City
    , c.IndustryType
    , o.OrderNo
    , o.OrderDate
    , o.SalesPersonID
    , o.Amount
;
SELECT
      c.Custid
    , c.Cname
    , c.City
    , c.IndustryType
    , o.OrderNo
    , o.OrderDate
    , o.SalesPersonID
    , o.Amount
    , AVG(o.Amount) OVER(PARTITION BY c.IndustryType, o.OrderDate)
        AS "Average Amount" 
    , MIN(o.Amount) OVER(PARTITION BY c.IndustryType, o.OrderDate)
        AS "Minimum Amount"
    , MAX(o.Amount) OVER(PARTITION BY c.IndustryType, o.OrderDate)
        AS "Maximum Amount"
FROM customer c
INNER JOIN orders o ON c.custid = o.custid