多个SUM和多个计算值

时间:2013-03-30 06:49:22

标签: mysql sum

在我的系统中计算传入材料和使用材料后,如果有人想要进行调整,则会有一个调整项目。

QUERY Incoming Material - 材料的使用

select (select sum(jumlah) from warehouse where tgl_invoice >= '2013-03-17' AND tgl_invoice <='2013-03;18' and kode=a.kode) - COALESCE((select sum(jumlah) from use_material where tanggal >= '2013-03-17' AND tanggal <='2013-03;18' and kode_barang=a.kode),0)  total, a.kode, a.nama from warehouse a group by a.kode;
+-------+---------+------------+
| total | kode    | nama       |
+-------+---------+------------+
|     4 | ACLG001 | AC LG 1 pk |
|   160 | P001    | Spindle    |
|    30 | S012    | Cable      |
+-------+---------+------------+
mysql> select * from adjusment;

结果:

+----+-------------+-------------+--------+--------+------------+---------------+
| id | kode_barang | nama_barang | status | jumlah | tanggal    | user          |
+----+-------------+-------------+--------+--------+------------+---------------+
|  7 | P001        | Spindle     | +      |     10 | 2013-03-30 | Administrator |
|  8 | P001        | Spindle     | -      |      5 | 2013-03-30 | Administrator |
|  9 | S012        | Cable       | +      |      0 | 2013-03-30 | Administrator |
+----+-------------+-------------+--------+--------+------------+---------------+

我已经计算了

select(select sum(jumlah) from adjusment where status='+') - (select sum(jumlah) from adjusment where status='-') as total,kode_barang,nama_barang from adjusment group by kode_barang;
+-------+-------------+-------------+
| total | kode_barang | nama_barang |
+-------+-------------+-------------+
|     5 | P001        | Spindle     |
|     5 | S012        | Cable       |
+-------+-------------+-------------+

我对最后一只股票的查询是这样的:

select (select sum(jumlah) from warehouse where tgl_invoice >= '2013-03-17' AND tgl_invoice <='2013-03;18' and kode=a.kode) - (select sum(jumlah) from use_material where tanggal >= '2013-03-17' AND tanggal <='2013-03:18' and kode_barang=a.kode) + COALESCE((select sum(jumlah) from adjusment where status='+' and kode_barang=a.kode),0) - COALESCE((select sum(jumlah) from adjusment where status='-' and kode_barang=a.kode),0) as total,a.kode,a.nama from warehouse a group by a.kode;
+-------+---------+------------+
| total | kode    | nama       |
+-------+---------+------------+
|  NULL | ACLG001 | AC LG 1 pk |
|   165 | P001    | Spindle    |
|    30 | S012    | Cable      |
+-------+---------+------------+

结果应为Cable = 35 和AC LG 1 PK = 4。

出了什么问题?

1 个答案:

答案 0 :(得分:0)

格式化后似乎更容易:

SELECT wh.total + COALESCE(adj.total,0) AS total, wh.kode, wh.nama FROM (
    SELECT(
        SELECT SUM(jumlah) FROM warehouse 
        WHERE tgl_invoice >= '2013-03-17' AND tgl_invoice <='2013-03;18' AND kode = a.kode
    ) - COALESCE(
        (SELECT SUM(jumlah) FROM use_material 
        WHERE tanggal >= '2013-03-17' AND tanggal <='2013-03;18' AND kode_barang = a.kode), 
        0
    ) AS total, 
    a.kode, a.nama FROM warehouse AS a 
    GROUP BY a.kode
) AS wh
LEFT JOIN
(
    SELECT(
        SELECT SUM(jumlah) FROM adjusment 
        WHERE status = '+'
    ) - (
        SELECT SUM(jumlah) FROM adjusment 
        WHERE status = '-'
    ) AS total, kode_barang, nama_barang FROM adjusment 
    GROUP BY kode_barang
) AS adj
ON wh.kode = adj.kode_barang