MySql:汇总每个类别和类型的最新存储金额

时间:2013-10-16 07:19:20

标签: mysql group-by sum sql-order-by

我有四个MySql表(这里简化):

表1:派系(仅供参考的清单)

id | name
 1 | FactionName1
 2 | FactionName2

表2:货币(仅供参考的清单)

id | name
 1 | Currency1
 2 | Currency2
 3 | Currency3

表3:事件(仅供参考的列表)

id | name   | date
 1 | Evebt1 | 2013-10-16
 2 | Event2 | 2013-10-18 (Note: date out of order)
 3 | Event3 | 2013-10-17

表4:event_banking(每个事件后输入的数据,每个组的每种货币的剩余金额)

id | faction_id | currency_id | event_id | amount
 1 |          1 |           1 |        1 |     10
 2 |          1 |           1 |        2 |     20
 3 |          1 |           1 |        3 |     30
 4 |          1 |           2 |        1 |     40
 5 |          1 |           2 |        2 |     50
 6 |          1 |           2 |        3 |     60
 7 |          1 |           3 |        1 |     70
 8 |          1 |           3 |        2 |     80
 9 |          1 |           3 |        3 |     90
10 |          2 |           1 |        1 |    100
11 |          2 |           1 |        2 |    110
12 |          2 |           1 |        3 |    120
13 |          2 |           2 |        1 |    130
14 |          2 |           2 |        2 |    140
15 |          2 |           2 |        3 |    150
16 |          2 |           3 |        1 |    160
17 |          2 |           3 |        3 |    170

注意:派系2没有为事件2提供货币3

我希望能够为每种货币获得每个派系最后一次存入(日期明智)的总数。 (即如果所有派别合并,目前每种货币的总金额总计为多少)

所以,我需要一张类似于:

的表格
currency_id | total
          1 |   130  (eg 20 + 110)
          2 |   190  (eg 50 + 140)
          3 |   250  (eg 80 + 170) <- Uses Event 3 for Group 2 as Event 2 doesn't exist

我可以做基本的连接等,但我很难能够过滤结果,以便我得到每个Faction x Currency x Event的最新结果,这样我就可以将它们加在一起得到最终的总金额每种货币。

我尝试了各种LEFT OUTER JOIN,GROUP BYss&amp; amp;有COUNTs,并有一些有趣的(但不正确的结果),以及各种不同的错误代码,但没有任何远远接近我需要的。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我想你可以继续这样的事情:

select eb.currency_id, sum(amount) as total 
from events e 
inner join (
   select faction_id, currency_id, max(date) as md
   from event_banking eb
   inner join events e
   on eb.event_id = e.id
   group by faction_id, currency_id
) a 
on e.date = a.md
inner join event_banking eb
on e.id = eb.event_id
and a.faction_id = eb.faction_id
and a.currency_id = eb.currency_id
group by currency_id;

这是SQL Fiddle