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
我试过了,但结果保持不变 – Sunarto
我调查了第一个子查询。可能有相同商品的更多记录。例如,如果material_in中有2个匹配的记录,并且material_out中有2个匹配的记录,则它们将相互相乘。如果您在没有分组/聚合的情况下运行第一个大子查询,则可以验证此情况。 (我修改了答案。) –
对你的查询保持不变,结果无效。我改变了我的查询是有效的,但执行查询需要很长时间 – Sunarto