与自己联系表

时间:2016-03-18 11:20:49

标签: mysql sql

我在这里有疑问......

Table : history
|id   |transaction|created_at         |merchant_id|
|-----|-----------|-------------------|-----------|
|1    |400        |2015-10-12 11:08:37|33         |
|1    |500        |2015-10-15 09:38:22|33         |
|1    |600        |2015-10-21 14:47:12|22         |
|2    |100        |2015-09-26 10:48:27|31         |
|2    |500        |2015-09-30 11:18:07|27         |
|2    |300        |2015-10-02 17:33:57|31         |

我希望当我做查询时:

SELECT SUM(a.transaction)/COUNT(a.transaction) AS avg_trans
FROM history AS a GROUP BY a.id, a.merchant_id

Result:
|id    |avg_trans|merchant_id|
|------|---------|-----------|
|1     |450      |33         |
|1     |600      |22         |
|2     |200      |31         |
|2     |500      |27         |

然后将avg_trans显示到表历史记录中,如下所示:

|id   |transaction|created_at         |avg_trans|merchant_id|
|-----|-----------|-------------------|---------|-----------|
|1    |400        |2015-10-12 11:08:37|450      |33         |
|1    |500        |2015-10-15 09:38:22|450      |33         |
|1    |600        |2015-10-21 14:47:12|600      |22         |
|2    |100        |2015-09-26 10:48:27|200      |31         |
|2    |200        |2015-09-30 11:18:07|500      |27         |
|2    |300        |2015-10-02 17:33:57|200      |31         |

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

使用相关子查询:

select h.*,
       (select avg(h2.transaction)
        from history h2
        where h2.id = h.id
       ) as avg_trans
from history h;

您也可以使用group by执行此操作。但是,上述内容可以利用history(id, transaction)上的索引。另请注意,SQL具有内置聚合函数AVG(),因此您也可以使用它。

group by / join版本如下:

select h.*, hh.avg_trans
from history h join
     (select id, avg(h2.transaction) as avg_trans
      from history h2
      where h2.id = h.id
     ) hh
     on h.id = hh.id;