0

我有 2 个表需要查询

**tbl_jobs**
jobid | description | someinfo
1        foo          bar
2        fuu          buu


**tbl_invlog**
idinv | jobid | type | ammount
1       1       add    100
2       1       rem     50
3       1       rem     15
4       1       add     8
5       2       add     42

结果应该是对库存“add”和“rem”求和,并为每个 jobid 提供 sum(add)-sum(rem) 的总和,包括其余的 job 信息。

jobid | description | someinfo | amountadd | amountrem | totaladdrem
1     | foo         | bar      | 108       | 65        | 43
2     | fuu         | buu      | 42        | 0         | 42

我用 select * from (select .... ) 做了一个四重选择语句,而不使用连接或其他很酷的东西。这非常慢。我对mysql很陌生。

我很高兴知道如何解决这个问题。提前致谢

4

1 回答 1

2

这是一个需要连接和条件聚合的查询:

select j.jobid, j.description, j.someinfo,
       sum(case when il."type" = 'add' then amount else 0 end) as AmountAdd,
       sum(case when il."type" = 'rem' then amount else 0 end) as AmountRem,
       (sum(case when il."type" = 'add' then amount else 0 end) -
        sum(case when il."type" = 'rem' then amount else 0 end)
       ) as totaladdrem
from tbl_jobs j left outer join
     tbl_invlog il
     on j.jobid = il.jobid
group by j.jobid, j.description, j.someinfo;

注意一些事情。首先,表具有在from子句中定义的表别名。这使您可以说出列来自哪个表。其次,表别名总是用于查询中的所有列。

MySQL 将允许您group by j.jobid使用称为“隐藏列”的功能来做。我认为这是一个坏习惯(在少数情况下除外),因此这会按作业表中的所有列进行汇总。

条件聚合是通过在sum()语句中放置条件来完成的。

于 2013-08-21T11:43:28.080 回答