找到每个组合出现的平均金额
finding the average amount for each combination occurence
我有一个 table (table1) :
| Country1 | Country2 |
Canada USA
Canada Mexico
USA Mexico
USA Canada
.
.
.
etc
那我还有一个table (table2):
| Country | Date | Amount |
Canada 01-01 1.00
Canada 01-02 0.23
USA 01-01 2.67
USA 01-02 5.65
USA 01-03 8.00
.
.
.
etc
我需要一个查询,它将两个 table 组合成这样的东西:
| Country1 | Average_amount_when_combined_with_country2| Country2 | Average_amount_when_combined_with_country1 |
Canada 0.615 USA 4.16
USA 4.16 Canada 0.615
当国家 1 与国家 2 在第一个出现时发生的事情 table 我想在国家 2 合并时获得国家 1 的平均金额,然后反之亦然,平均对于国家 2,当国家 1 为 combined.I 时,我尝试了不同的连接技术,但无法完全发挥作用,但现在我认为我无法真正进行任何传统连接,我将需要使用子查询的组合。我完全不知道如何仅在两个国家出现在同一日期时才获得平均值。这个查询是我能得到的最接近的,但问题是这只是获取整个国家的平均值,而不是两个国家合并时的平均值。
select country1, (select avg(amount) from table2 where country = country1) ,country2,(select avg(amount) from table2 where country = country2)
from table1
以下 SELECT 应该可以解决您的问题,或者至少应该让您了解它是如何工作的。
SELECT t1.Country1,
t1.Country2,
(
SELECT AVG(Amount)
FROM table2 t2
WHERE t2.Country = t1.Country1 AND
EXISTS
(
SELECT 1
FROM table2 t3
WHERE t3.Country = t1.Country2 AND
t2.Date = t3.Date
)
) Avg1,
(
SELECT AVG(Amount)
FROM table2 t2
WHERE t2.Country = t1.Country2 AND
EXISTS
(
SELECT 1
FROM table2 t3
WHERE t3.Country = t1.Country1 AND
t2.Date = t3.Date
)
) Avg2
FROM table1 t1
查看结果here。
在我看来,这会返回相同的信息,但以更合乎逻辑的方式(您的预期输出在两行中显示相同的内容,只是颠倒了)。
select t2a.country as country1,
t2b.country as country2,
avg(t2b.amount) as avg_amount
from table2 t2a
join table2 t2b
on t2a.date = t2b.date
join table1 t1
on t2a.country = t1.country1
and t2b.country = t1.country2
group by t2a.country, t2b.country
Fiddle: http://sqlfiddle.com/#!2/34968/2/0
输出:
| COUNTRY1 | COUNTRY2 | AVG_AMOUNT |
|----------|----------|------------|
| Canada | USA | 4.16 |
| USA | Canada | 0.615 |
如果我没理解错的话,您需要先按国家/地区汇总 table2
,然后再进行任何联接。否则,你 运行 笛卡尔积的风险。在 MySQL 中,您可以使用两个子查询来解决这个问题:
select t1.country, t2_1.amount as avg1, t2.country, t2_2.amount
from table1 t1 join
(select t2.country, avg(amount) as amount
from table2 t2
group by t2.country
) t2_1
on t1.country1 = t2_1.country join
(select t2.country, avg(amount) as amount
from table2 t2
group by t2.country
) t2_2
on t1.country2 = t2_2.country;
在其他数据库中,您可能会使用通用的 table 表达式 (CTE) 来避免重复的子查询。
我有一个 table (table1) :
| Country1 | Country2 |
Canada USA
Canada Mexico
USA Mexico
USA Canada
.
.
.
etc
那我还有一个table (table2):
| Country | Date | Amount |
Canada 01-01 1.00
Canada 01-02 0.23
USA 01-01 2.67
USA 01-02 5.65
USA 01-03 8.00
.
.
.
etc
我需要一个查询,它将两个 table 组合成这样的东西:
| Country1 | Average_amount_when_combined_with_country2| Country2 | Average_amount_when_combined_with_country1 |
Canada 0.615 USA 4.16
USA 4.16 Canada 0.615
当国家 1 与国家 2 在第一个出现时发生的事情 table 我想在国家 2 合并时获得国家 1 的平均金额,然后反之亦然,平均对于国家 2,当国家 1 为 combined.I 时,我尝试了不同的连接技术,但无法完全发挥作用,但现在我认为我无法真正进行任何传统连接,我将需要使用子查询的组合。我完全不知道如何仅在两个国家出现在同一日期时才获得平均值。这个查询是我能得到的最接近的,但问题是这只是获取整个国家的平均值,而不是两个国家合并时的平均值。
select country1, (select avg(amount) from table2 where country = country1) ,country2,(select avg(amount) from table2 where country = country2)
from table1
以下 SELECT 应该可以解决您的问题,或者至少应该让您了解它是如何工作的。
SELECT t1.Country1,
t1.Country2,
(
SELECT AVG(Amount)
FROM table2 t2
WHERE t2.Country = t1.Country1 AND
EXISTS
(
SELECT 1
FROM table2 t3
WHERE t3.Country = t1.Country2 AND
t2.Date = t3.Date
)
) Avg1,
(
SELECT AVG(Amount)
FROM table2 t2
WHERE t2.Country = t1.Country2 AND
EXISTS
(
SELECT 1
FROM table2 t3
WHERE t3.Country = t1.Country1 AND
t2.Date = t3.Date
)
) Avg2
FROM table1 t1
查看结果here。
在我看来,这会返回相同的信息,但以更合乎逻辑的方式(您的预期输出在两行中显示相同的内容,只是颠倒了)。
select t2a.country as country1,
t2b.country as country2,
avg(t2b.amount) as avg_amount
from table2 t2a
join table2 t2b
on t2a.date = t2b.date
join table1 t1
on t2a.country = t1.country1
and t2b.country = t1.country2
group by t2a.country, t2b.country
Fiddle: http://sqlfiddle.com/#!2/34968/2/0
输出:
| COUNTRY1 | COUNTRY2 | AVG_AMOUNT |
|----------|----------|------------|
| Canada | USA | 4.16 |
| USA | Canada | 0.615 |
如果我没理解错的话,您需要先按国家/地区汇总 table2
,然后再进行任何联接。否则,你 运行 笛卡尔积的风险。在 MySQL 中,您可以使用两个子查询来解决这个问题:
select t1.country, t2_1.amount as avg1, t2.country, t2_2.amount
from table1 t1 join
(select t2.country, avg(amount) as amount
from table2 t2
group by t2.country
) t2_1
on t1.country1 = t2_1.country join
(select t2.country, avg(amount) as amount
from table2 t2
group by t2.country
) t2_2
on t1.country2 = t2_2.country;
在其他数据库中,您可能会使用通用的 table 表达式 (CTE) 来避免重复的子查询。