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

Tai*_*mar 5 mysql sql group-by average sum

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

我有2个表,一个叫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  |
+-----------+----------+--------------+----------+--------+
Run Code Online (Sandbox Code Playgroud)

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

valid_country

+--------------+--------------+
|     ref      |   country    |
+--------------+--------------+
|    1029      |     US       |
+--------------+--------------+
|    1029      |     RU       |
+--------------+--------------+
|    1053      |     UK       |
+--------------+--------------+
Run Code Online (Sandbox Code Playgroud)

此表列出了可以对其值进行平均的所有"好"国家/地区.

我想要的结果查询是:

+----------+------------+-------------+
|   ref    | AVG(value) | SUM(volume) |
+----------+------------+-------------+
|  1029    |    1 450   |     720     |
+----------+------------+-------------+
|  1053    |    1 200   |     110     |
+----------+------------+-------------+
Run Code Online (Sandbox Code Playgroud)

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

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

Gor*_*off 1

我认为比较valid_country需要同时使用refand country

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;
Run Code Online (Sandbox Code Playgroud)

这对于您的示例数据并不重要,但对于更大的问题可能很重要。