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」の合計を作成し、残りのジョブ情報を含む各ジョブ ID の合計 sum(add)-sum(rem) になります。

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

結合やその他のクールなものを使用せずに、select * from (select .... ) を使用して 4 つの 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まず、テーブルには、句で定義されたテーブル エイリアスがあります。これにより、列がどのテーブルからのものかを言うことができます。第 2 に、クエリ内のすべての列に対して常にテーブル エイリアスが使用されます。

group by j.jobidMySQLでは、「隠し列」と呼ばれる機能を使用して、単に行うことができます。これは悪い習慣だと思います (いくつかのケースを除いて)。これは、jobs テーブルのすべての列で集計されます。

sum()条件付き集計は、ステートメントに条件を入れることによって行われます。

于 2013-08-21T11:43:28.080 に答える