找到每个组合出现的平均金额

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) 来避免重复的子查询。