2013-10-12 3 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) 

테이블 소재에서 나는 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.barcode=goods.barcode를 작성해야 어쩌면 당신이 쿼리를 요약하는 데 도움이 될 수 있습니다 신속하게

SELECT COALESCE(tIN.total_in,0) + COALESCE(production.total_prod,0) AS incoming, COALESCE(tOUT.total_out,0) AS expenditure,br.barcode as barcode, br.name,br.initial_stock,br.unit,COALESCE(adj.total,0) AS adjusment,COALESCE(tIN.total_in,0) + COALESCE(production.total_prod,0) + COALESCE(adj.total,0) + COALESCE(br.intial_stock,0) - COALESCE(tOUT.total_out,0) as final_stok,so.stock_opname from (
select barcode,name,initial_stock,unit from barang where category=1 
) as br 
LEFT JOIN (
select (select sum(qty) from material_out where date >= '2013-05-01' AND date <='2013-08-31' and barcode=a.barcode) as total_out,a.barcode from material_out a group by a.barcode 
) as tOUT 
ON tOUT.barcode=br.barcode 
LEFT JOIN 
(
SELECT(
SELECT SUM(qty) FROM adjusment 
WHERE status = '+' AND date >= '2013-05-01' AND date <= '2013-08-31' 
) - (
SELECT SUM(qty) FROM adjusment 
WHERE status = '-' AND date >= '2013-05-01' AND date <= '2013-08-31' 
) AS total,barcode FROM adjusment 
GROUP BY barcode 
) AS adj 
ON br.barcode = adj.barcode 
LEFT JOIN (
select (select sum(qty) from material_in where date >= '2013-05-01' AND date <='2013-08-31' and barcode=a.barcode) as total_in,a.barcode,a.nama from material_in a group by a.barcode 
) as tIN 
ON br.barcode=tIN.barcode 
LEFT JOIN (
select (select sum(qty) from view_production where date >= '$start' AND date <='$end' and kode=a.kode) as total_prod,a.barcode from view_production a group by a.barcode 
) as production 
ON br.barcode=production.barcode 

LEFT JOIN (
select(select sum(qty) from stock_opname where date >= '2013-04-01' AND date <= '2013-05-31' AND barcode=a.barcode) as stok_opname,a.barcode from pencacahan a group by a.barcode 
) as so 
ON br.barcode=so.barcode 

답변

0

대신 tIN.kode=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

관련 문제