MySQL - 在某些行上选择AVG,在所有行上选择SUM

时间:2015-07-03 09:30:34

标签: mysql sql group-by sum average

我试图平均某些特定行的值,但总计所有行的总和。

我有两个表,一个名为exchanges,另一个名为valid_country

交流

+-----------+----------+--------------+----------+--------+
|     id    |   ref    |     country  |   value  | volume |
+-----------+----------+--------------+----------+--------+
|     1     |  1029    |      DE      |   1 000  |   100  |
+-----------+----------+--------------+----------+--------+
|     2     |  1029    |      US      |   2 000  |   250  |
+-----------+----------+--------------+----------+--------+
|     3     |  1029    |      FR      |   3 500  |   300  |
+-----------+----------+--------------+----------+--------+
|     4     |  1053    |      UK      |   1 200  |   110  |
+-----------+----------+--------------+----------+--------+
|     5     |  1029    |      RU      |     900  |    70  |
+-----------+----------+--------------+----------+--------+

此表包含许多引用(参考),它们具有不同的国家/地区,它们本身具有不同的值和数量。

valid_country

+--------------+--------------+
|     ref      |   country    |
+--------------+--------------+
|    1029      |     US       |
+--------------+--------------+
|    1029      |     RU       |
+--------------+--------------+
|    1053      |     UK       |
+--------------+--------------+

此表列出了可以平均值的所有“好”国家/地区。

我想要的结果是:

+----------+------------+-------------+
|   ref    | AVG(value) | SUM(volume) |
+----------+------------+-------------+
|  1029    |    1 450   |     720     |
+----------+------------+-------------+
|  1053    |    1 200   |     110     |
+----------+------------+-------------+

首先参考是GROUP BY。 Ref 1029的AVERAGE值仅为US和RU(因为表valid_country),但是SUM卷的所有国家/地区。 Ref 1053也是如此,但由于只有一行很容易。

这是一个小Fiddle。 SQL请求是错误的,因为它平均所有国家而不仅是好国家。

4 个答案:

答案 0 :(得分:2)

您可以使用LEFT JOINCASE语句忽略AVGSQLFiddle)中的某些值:

SELECT e.ref,
       AVG(CASE WHEN vc.country IS NOT NULL THEN e.value END) AS average,
       SUM(e.volume) AS volume
FROM exchanges e
LEFT JOIN valid_country vc ON ( vc.country = e.country )
GROUP BY e.ref
如果不匹配,

CASE会返回NULLAVG会忽略这些值:

|  ref | average | volume |
|------|---------|--------|
| 1029 |    1450 |    720 |
| 1053 |    1200 |    110 |

答案 1 :(得分:1)

您可以通过在mysql。Demo

中的聚合函数中使用case语句来实现此目的
__init__.py

答案 2 :(得分:1)

此查询使用子查询来提供正确的结果:

ipb

答案 3 :(得分:1)

我认为与valid_country的比较需要同时使用refcountry

SELECT e.ref,
       AVG(CASE WHEN vc.country IS NOT NULL THEN e.value END) AS average,
       SUM(e.volume) AS volume
FROM exchanges e LEFT JOIN
     valid_country vc
     ON vc.country = e.country AND vc.ref = e.ref
GROUP BY e.ref;

这与您的样本数据无关,但对于较大的问题可能很重要。