我试图平均某些特定行的值,但总计所有行的总和。
我有两个表,一个名为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请求是错误的,因为它平均所有国家而不仅是好国家。
答案 0 :(得分:2)
您可以使用LEFT JOIN
和CASE
语句忽略AVG
(SQLFiddle)中的某些值:
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
会返回NULL
,AVG
会忽略这些值:
| ref | average | volume |
|------|---------|--------|
| 1029 | 1450 | 720 |
| 1053 | 1200 | 110 |
答案 1 :(得分:1)
您可以通过在mysql。Demo
中的聚合函数中使用case语句来实现此目的__init__.py
答案 2 :(得分:1)
此查询使用子查询来提供正确的结果:
ipb
答案 3 :(得分:1)
我认为与valid_country
的比较需要同时使用ref
和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;
这与您的样本数据无关,但对于较大的问题可能很重要。