基于条件if从另一个表中选择SUM

时间:2012-10-05 20:34:49

标签: mysql

数据库:mysql> ver 5.0

table 1: type_id (int), type
table 2: name_id, name, is_same_as = table2.name_id or NULL
table 3: id, table2.name_id, table1.type_id, value (float)

我想对table 3中的值进行求和,并计算table2.name_id相同的值,并将id的值包含在is_same_is=name_id中。我想在table3中为table2中的所有值选择所有数据。

如果我的问题不是很清楚,如果已经得到回答但我无法找到相关答案,请道歉。或者不知道该找什么。

[data]. table1
id | type
=========
1  | test1
2  | test2

[data].table2
name_id  |  name  | is_same_as
==============================
1        |  tb_1  | NULL
2        |  tb_2  | 1
3        |  tb_3  | NULL
4        |  tb_4  | 1

[data].table3
id    |   name_id  |  type_id | value
======================================
1     |   1        |  1       | 1.5
2     |   2        |  1       | 0.5
3     |   2        |  2       | 1.0


output:
name_id| type_id|SUM(value)
=======================================================
1      | 1      |2.0  < because in table2, is_same_as = 1
2      | 2      |1.0

2 个答案:

答案 0 :(得分:0)

我认为以下是您想要的:

select coalesce(t2.is_same_as, t2.name_id) as name_id, t3.type_id, sum(value)
from table_3 t3 join
     table_2 t2
     on t3.name_id = t2.name_id
group by coalesce(t2.is_same_as, t2.name_id), t3.type_id
order by 1, 2

它加入了name_id的表格。但是,它会使用is_same_as列(如果存在)或name_id(如果不存在)来汇总数据。

答案 1 :(得分:0)

这可能就是你要找的东西:(我没有在MySQL中测试它,所以可能会有拼写错误)

with combined_names_tab (name_id, name_id_ref) as
(
select name_id, name_id from table2
union select t2a.name_id, t2b.name_id
  from table2 t2a 
  join table2 t2b 
    on (t2a.name_id = t2b.is_same_as)
)
select cnt.name_id, t3.type_id, sum(t3.value) sum_val
  from combined_names_tab cnt
  join table3 t3
    on ( cnt.name_id_ref = t3.name_id )
 group by cnt.name_id, t3.type_id
having sum(t3.value) / count(t3.value) >= 3

以下是查询的作用:

首先,它创建'combined_names_tab',它是您想要GROUP BY的所有table2行的连接,使用“is_same_as”列来进行该确定。我确保通过UNION包含“父”行。

其次,一旦你上面有这些行,它就是一个简单的连接到table3的GROUP BY和SUM。

注意:table1是不必要的(我相信)。

让我知道这是否有效!

...约翰