将分组应用于If语句结果

时间:2016-03-23 23:28:00

标签: mysql sql

基本上,我有两张桌子:
表A

aId|isOne|bId
---+-----+---
1  |1    |2
2  |0    |2
3  |1    |1

表B

bId|one|two
---+---+---
1  |5  |13
2  |3  |11

表A参考表B并指定是否需要onetwo的数据。我需要做的是对给定bId的值求和,因此这些表上的查询的预期结果将是:

bId|value
---+-----
2  |14
1  |5

目前,我执行此操作的查询格式如下:

select bId, 
        coalesce(if(bId = 0, null, 
                    sum(if(isOne = 0, 
                           (select two from tableB where tableB.bId = bId),
                           (select one from tableB where tableB.bId = bId)))) as value 
from (select bId, isOne, one, two from tableA 
      join tableB on tableA.bId = tableB.bId) as tableRes;

请注意,这是较大查询的一部分,并使用较大的表,其中coalesce和first if语句确实有意义使用。

虽然上面的查询出现错误(

  

错误代码:1242。子查询返回超过1行)

被认为来自sum()内的if语句。我尝试应用group by,因为我认为我需要将bId = 2值结果组合在一起,但未能合法地放置,或者将其合法地置于查询中并让它实际停止子查询返回多个结果。修复错误的任何方向或帮助都会受到赞赏,也可以很好地知道,如上所述,这是查询的精简版本,所以如果认为问题不是已经显示的更多可以添加,但我对上述版本中的错误非常有信心。

3 个答案:

答案 0 :(得分:0)

我只是内部加入2个表并在sum()中使用case语句来对正确的值求和:

select tableA.bId, sum(case when isOne=0 then two when isOne=1 then one else 0 end) as val
from tableA 
inner join tableB on tableA.bId = tableB.bId
group by tableA.bId ;

答案 1 :(得分:0)

你不需要这么复杂的结构,只需要在连接中进行总结。

SELECT tableA.bId, SUM(IF(isOne, one, two)) AS value
FROM tableA
JOIN tableB ON tableA.bId = tableB.bId
GROUP BY tableA.bId

答案 2 :(得分:0)

我真的能够通过简单地用指定值bId替换子查询中的任意tableA.bId来解决这个问题,对于任何对答案感兴趣的人来说。