1

我有以下问题,我需要根据其他两个表中给出的规范返回一个表中值的多个差异。我很确定这可以通过在正确的位置进行一些内部连接来完成。我遇到的最大问题是一个事实可能还有两个以上的值需要比较,并且结果应该总是在一行中返回。

应该返回的差异是根据表 C 中的值计算的,应该比较的规范在表 A 中给出。

下面我做了一个情况示例,因为它更容易显示情况和示例返回行。我尝试了很多技巧,但都没有成功,因此我们将不胜感激。

数据库使用 MySQL。

提前致谢!

表 A:

|  identifier  |  type   |   top_id
-------------------------------------
|   aaaa       |   X     |   
|   bbbb       |   Y     |    aaaa
|   cccc       |   Y     |    aaaa
|   dddd       |   Y     |    aaaa

表 B:

|  identifier  |  is_base
--------------------------
|   bbbb       |   TRUE
|   cccc       |   FALSE
|   dddd       |   FALSE

表 C:

|  identifier  |  type   | sub_type |  value
----------------------------------------------
|   bbbb       |   A     |    Q     |   100
|   cccc       |   A     |    Q     |   90
|   dddd       |   A     |    Q     |   80

结果:

|    top_id    |    base    |   diff1_id |  diff1_value  |  diff2_id  |  diff2_value   
-------------------------------------------------------------------------------------
|    aaaa      |    bbbb    |    cccc    |     10        |   dddd     |     20
4

1 回答 1

2

尝试:

select at.top_id,
       ct.identifier,
       group_concat(concat(cf.identifier,':', ct.value-cf.value)) diffs
from TableA at
join TableB bt on at.identifier = bt.identifier and bt.is_base = 'TRUE'
join TableC ct on bt.identifier = ct.identifier 
join TableA af on at.top_id = af.top_id
join TableB bf on af.identifier = bf.identifier and bf.is_base = 'FALSE'
join TableC cf on bf.identifier = cf.identifier 
group by ct.identifier

SQLFiddle在这里

于 2013-05-04T13:41:14.390 回答