MariaDB(MySQL)" AVG"不使用HAVING

时间:2016-08-08 06:12:01

标签: mysql mariadb having

我的问题是:为什么以下两个SQL语句产生不同的结果(我之后解释。使用XAMPP 7.0.8测试MariaDB)

(1)

SELECT
stock_exchange_code,
summed
FROM (
   SELECT
     stock_exchange_code,
     summed
   FROM (
          SELECT
            STOCK_EXCHANGE_CODE,
            sum(SHARE_PRICE * SHARE_CNT) AS summed
          FROM LISTED_AT
          WHERE DATE_VALID = STR_TO_DATE('04-12-2015', '%d-%m-%Y')
          GROUP BY STOCK_EXCHANGE_CODE
        ) a) b
HAVING summed > avg(summed)

(2)

SELECT
stock_exchange_code,
summed
FROM (
   SELECT
     STOCK_EXCHANGE_CODE,
     sum(SHARE_PRICE * SHARE_CNT) AS summed
   FROM LISTED_AT
   WHERE DATE_VALID = STR_TO_DATE('04-12-2015', '%d-%m-%Y')
   GROUP BY STOCK_EXCHANGE_CODE
 ) a
WHERE summed > (SELECT avg(a.summed)
            FROM (SELECT
                    sum(SHARE_PRICE * SHARE_CNT) AS summed
                  FROM LISTED_AT
                  WHERE DATE_VALID = STR_TO_DATE('04-12-2015', '%d-%m-%Y')
                  GROUP BY STOCK_EXCHANGE_CODE) a)

这些查询的结果: (1)会给你一套空的(我不明白为什么) (2)会给你2行,这是正确的答案

2个Select语句的说明:

  SELECT
     STOCK_EXCHANGE_CODE,
     sum(SHARE_PRICE * SHARE_CNT) AS summed
   FROM LISTED_AT
   WHERE DATE_VALID = STR_TO_DATE('04-12-2015', '%d-%m-%Y')
   GROUP BY STOCK_EXCHANGE_CODE

这是Select语句的一部分,它汇总了特定证券交易所的所有股票价值。 输出是:

BRX 122653.50

L& S 275000.00

MXK 500000.00

STU 140415.00

XETRA 254610.00

和AVG(求和)= 258535.6

使用声明(1)[我先尝试过]我使用select来确定group by是全局的。现在看一下,有一个不必要的" serlect所有列名称",bur这应该不重要。使用外部选择我尝试应用" HAVING"子句。

我确实希望所有在特定日期汇总价值(=>"汇总")的证券交易所高于平均水平。据我了解HAVING,它应该计算全球平均值(=以上5个证券交易所的>)并对此进行检查。

我不知道,为什么这不起作用。将summed > avg(summed)更改为summed <> avg(summed)会产生一行(BRX 122653.50)。 summed > 0会返回所有5行。 这就是为什么我认为平均值不适用于而不是相反的方式。

(2) 这与第一个完全相同,用更多的explecit平均值计算替换HAVING子句。正如您所看到的,有2个子查询的名称为&#34; a&#34;两者都是相同的(第二个缺少stock_exchange_code字段。实际上这个查询与第一个查询相同,代码质量比第一个更严重(重复)。

我的问题是:对我来说,2个查询应该有相同的结果。为什么他们有不同的结果?

TL;博士

Average或having子句在MySQL(MariaDB)中似乎不起作用。为什么从一开始的2个SQL语句不会返回相同的内容?

0 个答案:

没有答案