2013-10-12 132 views
0

我有一个像这样的表格模式。结果总和不匹配

mysql> desc material_out; 

+-------------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+-------------+--------------+------+-----+---------+-------+ 
| id   | int(11)  | NO |  | 0  |  | 
| barcode  | varchar(20) | NO |  | NULL |  | 
| name  | varchar(100) | NO |  | NULL |  | 
| qty   | double  | YES |  | NULL |  | 
| unit  | varchar(20) | YES |  | NULL |  | 
| num_letter | varchar(30) | YES |  | NULL |  | 
| date  | date   | YES |  | NULL |  | 
| destination | varchar(50) | YES |  | NULL |  | 
+-------------+--------------+------+-----+---------+-------+ 
8 rows in set (0.00 sec) 

mysql> desc material_in; 

+-------------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+-------------+--------------+------+-----+---------+-------+ 
| id   | int(11)  | NO |  | 0  |  | 
| barcode  | varchar(20) | NO |  | NULL |  | 
| name  | varchar(100) | NO |  | NULL |  | 
| qty   | double  | YES |  | NULL |  | 
| unit  | varchar(20) | YES |  | NULL |  | 
| num_letter | varchar(30) | YES |  | NULL |  | 
| date  | date   | YES |  | NULL |  | 
| destination | varchar(50) | YES |  | NULL |  | 
+-------------+--------------+------+-----+---------+-------+ 
8 rows in set (0.00 sec) 

mysql> desc goods; 

+-------------+--------------+------+-----+---------+-------+ 
| Field  | Type   | Null | Key | Default | Extra | 
+-------------+--------------+------+-----+---------+-------+ 
| id   | int(11)  | NO |  | 0  |  | 
| barcode  | varchar(20) | NO |  | NULL |  | 
| name  | varchar(100) | NO |  | NULL |  | 
| unit  | varchar(20) | YES |  | NULL |  | 
| category | varchar(25) | YES |  | NULL |  | 
| first_stok | double ) | YES |  | NULL |  | 
+-------------+--------------+------+-----+---------+-------+ 
6 rows in set (0.00 sec) 

在material_out中我有10,000行的数据。并有多达350种类型的条形码。在material_in表中,我有大约15,000行的数据。并有多达200种类型的条形码。

我的查询是这样的

SELECT br.barcode, 
    COALESCE(tNEW.total_out,0) AS total_out, COALESCE(tNEW.total_in,0) as total_in, 
    COALESCE(tNEW.total_in,0)-COALESCE(tNEW.total_out,0) AS result, 
    COALESCE(tOLD.total_out,0) AS total_out_old, COALESCE(tOLD.total_in,0) AS total_in_old 
FROM (
SELECT barcode from goods where category=1 
) as br 
LEFT JOIN (
    SELECT goods.barcode, 
     COALESCE(SUM(tOUT.qty),0) AS total_out, 
     COALESCE(SUM(tIN.qty),0) AS total_in 
    FROM goods 
    LEFT JOIN material_out AS tOUT ON tOUT.barcode=goods.barcode 
    LEFT JOIN material_in AS tIN ON tIN.barcode=goods.barcode 
    WHERE goods.category=1 
     AND tOUT.date >='2013-05-01' AND tOUT.date <='2013-08-31' 
     AND tIN.date >= '2013-05-01' AND tIN.date <= '2013-08-31' 
    GROUP BY goods.barcode 
) AS tNEW ON tNEW.barcode=br.barcode 
LEFT JOIN (
    SELECT goods.barcode, 
     SUM(tOUT.qty) AS total_out, 
     SUM(tIN.qty) AS total_in 
    FROM goods 
    LEFT JOIN material_out AS tOUT ON tOUT.barcode=goods.barcode 
    LEFT JOIN material_in AS tIN ON tIN.kode=goods.barcode 
    WHERE goods.category=1 
     AND tOUT.date BETWEEN '2013-01-01' AND '2013-04-31' 
     AND tIN.date BETWEEN '2013-01-01' AND '2013-04-31' 
    GROUP BY goods.barcode 
) AS tOLD ON tOLD.barcode=br.barcode 
我用那样的查询

。结果进展顺利。但是当我尝试输入新数据时。然后我重新查询你的显示器。但结果与输入的数据不符。例如,当我输入您的查询时。以下结果

+--------------+-----------+----------+------------+---------------+-------------------+ 
| barcode | total_out | total_in | result  | total_out_old | total_in_old  | 
+--------------+-----------+----------+------------+---------------+-------------------+ 
| TNWET021  |  6195 | 15000 |  8805 |   20085 |    46200 | 
| TNWET020  |  3420 |  7650 |  4230 |   4860 |    23925 | 
| TNWET019  |  8370 | 25200 |  16830 |   11610 |    47175 | 
| TNWET018  |  18690 | 44100 |  25410 |   13800 |    54150 | 
| TNWET017  |  1140 |  3750 |  2610 |   3690 |    16200 | 
| TNWET016  |  19500 | 56100 |  36600 |   31725 |   111300 | 
| TNWET015  |  5145 | 18150 |  13005 |   6510 |    23400 | 
| TNWET014  |  33300 | 65250 |  31950 |   96300 |   262500 | 
| TNWET013  |  1170 |  5625 |  4455 |   3690 |    13200 | 
| TNWET012  |  720 |  2700 |  1980 |   3870 |    13800 | 
| TNWET011  |   0 |  0 |   0 |   180 |    450 | 
| TNWET010  |   0 |  0 |   0 |   405 |    1125 | 
| TNWET009  |   0 |  0 |   0 |    0 |     0 | 

当我做了这样的手动求和和结果。

mysql> select sum(qty) from material_in where barcode='TNWET021' and date BETWEEN '2013-05-01' AND '2013-08-31'; 
+-------------+ 
| sum(qty) | 
+-------------+ 
|   750 | 
+-------------+ 
1 row in set (0.00 sec) 

mysql> select sum(qty) from material_in where barcode='TNWET020' and date BETWEEN '2013-05-01' AND '2013-08-31'; 
+-------------+ 
| sum(qty) | 
+-------------+ 
|   450 | 
+-------------+ 
1 row in set (0.00 sec) 

当数据对于报告非常重要时,为什么结果可能会有很大的不同。请帮帮我。

我以前用过这个,但执行起来需要很长时间。也许你可以帮助总结本查询,快速执行的而不是tIN.kode=goods.barcode

​​

回答

0

你应该写tIN.barcode=goods.barcode

你可以试试吗?

SELECT goods.barcode, 
    tOUT.qty, 
    tIN.qty 
FROM goods 
LEFT JOIN material_out AS tOUT ON tOUT.barcode=goods.barcode 
LEFT JOIN material_in AS tIN ON tIN.barcode=goods.barcode 
WHERE goods.category=1 
    AND tOUT.date >='2013-05-01' AND tOUT.date <='2013-08-31' 
    AND tIN.date >= '2013-05-01' AND tIN.date <= '2013-08-31' 

我有一个假设。 (请参阅评论。) 您将看到相同数量的数字超出您的预期。

如果我是对的,那么你应该首先汇总所有部分结果,并在稍后加入。

+0

我试过了,但结果保持不变 – Sunarto

+0

我调查了第一个子查询。可能有相同商品的更多记录。例如,如果material_in中有2个匹配的记录,并且material_out中有2个匹配的记录,则它们将相互相乘。如果您在没有分组/聚合的情况下运行第一个大子查询,则可以验证此情况。 (我修改了答案。) –

+0

对你的查询保持不变,结果无效。我改变了我的查询是有效的,但执行查询需要很长时间 – Sunarto