2016-03-18 4 views
0

у меня есть вопрос здесь ...Присоединение таблицы с себя

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   | 

Кто-нибудь может мне помочь?

ответ

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; 
+0

о ,, спасибо, сэр ... я не знаю, что мы можем использовать подзапрос. здорово. –

+0

сэр .. проверьте мой вопрос с обновлением –

Смежные вопросы