SQL连接表,范围内的聚合列

时间:2015-07-22 12:58:52

标签: mysql sql ms-access

我的数据库中有两个表,如下所示:

 event  | id | value
--------------------
   1    | A  |   10
   2    | B  |   10
   3    | C  |   15
   4    | A  |   15
   5    | D  |   20
   6    | B  |   25

id | value | cost
-----------------
 A |   11  |  5
 B |   12  |  5
 A |   13  |  5
 A |   14  |  5
 C |   16  |  5
 D |   35  |  5

我想对表1中的eventid列进行分组,然后将表{2}中的cost列与相应的id相加,如果{{1} t2中的列在t1中value列的特定范围内。

例如,如果我的范围是+3,我想返回:

value

我还没有能够完成这项工作......任何提示都非常感谢!我大多熟悉MySQL。最终,我必须在MS Access中实现这一点,但知道如何在两者中完成它将是一件好事。谢谢!

编辑:这是我尝试的代码。它仅适用于那些仅在第二个表中出现一次的ID。

id_event | total
----------------
   A1    |  10    // 2 rows in t2 with id=A and value between 10 and 13, each with cost = 5
   B2    |  5  
   C3    |  5  
   A4    |  0     // For A4, t1 value = 15, no (id=A) entries in t2 with 15 < value <= 18
   D5    |  0  
   B6    |  0  

1 个答案:

答案 0 :(得分:1)

您可以通过在此聚合求和函数中使用条件案例表达式来实现所需的结果。

使用MySQL(或任何符合ANSI SQL的数据库),查询可能如下所示:

select 
    concat(t1.event, t1.id) id_event, 
    sum(case when t2.value between t1.value and t1.value + 3 then t2.cost else 0 end) total
from table1 t1
inner join table2 t2 on t1.id = t2.id
group by concat(t1.event, t1.id)

concat应更改为与您正在使用的特定数据库一起使用的字符串连接函数。

MS Access使用稍微不同的语法,我认为它应该如下所示:

select 
    t1.event & Cstr(t1.id) id_event, 
    sum(iif(t2.value between t1.value and t1.value + 3, t2.cost,0)) total
from table1 t1
inner join table2 t2 on t1.id = t2.id
group by t1.event & Cstr(t1.id)