mysql总和没有正确计算

时间:2018-03-22 13:26:56

标签: mysql

我对MySQL有疑问。我有3张桌子:

新订单表:

+------------+---------+----------+------------+---------------+-----------+----------+-----------+----------+------+----------+------------+-----------+
| neworderid | orderno | customer | date       | stocklocation | product   | quantity | unitprice | discount | tax  | total    | grandtotal | status    |
+------------+---------+----------+------------+---------------+-----------+----------+-----------+----------+------+----------+------------+-----------+
| ORD001     | ORD-001 | abc      | 2018-02-27 | Bangalore     | sssssssss |        2 |     28000 |        2 |   18 |  64758.4 |          0 | Approved  |
| ORD002     | ORD-002 | abc      | 2018-03-05 | Bangalore     | sssssssss |        8 |     28000 |        2 |   18 | 259033.6 |          0 | Approved  |
| ORD003     | ORD-003 | hhh      | 2018-03-05 | Haveri        | sssssssss |        2 |     28000 |       50 |   30 |    36400 |          0 | Cancelled |
+------------+---------+----------+------------+---------------+-----------+----------+-----------+----------+------+----------+------------+-----------+  

addproductfromsupplier:

+-------------------+-----------+------------+--------------+---------------+---------------------------------------------------------------------------+-------------+----------+-----------+-------+-------------+------------+-------------+
| supplierproductid | invoiceno | date       | suppliername | stocklocation | address                                                                   | productname | quantity | unitprice | tax   | total       | grandtotal | status      |
+-------------------+-----------+------------+--------------+---------------+---------------------------------------------------------------------------+-------------+----------+-----------+-------+-------------+------------+-------------+
| SUPR001           | CM-001    | 2018-02-12 | COMPANY1     | Bangalore     | AAAAAASSSSSSDDDDD                                                         | sssssssss   |       10 |   2500.00 |  5.00 |  26250.0000 |       NULL | received    |
| SUPR002           | CM-001    | 2018-02-12 | COMPANY1     | Bangalore     | AAAAAASSSSSSDDDDD                                                         | sssss       |       10 |   1000.00 |  6.00 |  10600.0000 |       NULL | received    |
| SUPR003           | INC-001   | 2017-05-07 | eeee         | Bangalore     |                  qqqq                                                     | sssssssss   |        5 |  28000.00 | 18.00 | 165200.0000 |       NULL | notreceived |
| SUPR004           | INV-0001  | 2018-03-17 | hh           | Haveri        |                                     AAAAAAA                               | sssssssss   |        2 |  28000.00 | 18.00 |  66080.0000 |       NULL | notreceived |
+-------------------+-----------+------------+--------------+---------------+---------------------------------------------------------------------------+-------------+----------+-----------+-------+-------------+------------+-------------+

费用表:

+-----------------+------------+--------+
| description     | date       | amount |
+-----------------+------------+--------+
| office Cleaning | 2018-03-17 |    500 |
+-----------------+------------+--------+  

我无法正确查询查询:

select sum(A.total) as totalsales
     , sum(B.total) as totalpurchase
     , (sum(A.total)-sum(B.total)) as grossprofit
     , sum(C.amount) as expence
     , ((sum(A.total)-sum(B.total))-sum(C.amount)) as netprofit 
  from newordertable A
     , addproductfromsupplier B
     , expensetable C 
 where A.date between '2018-3-05' and '2018-3-18' 
   and B.date between '2018-3-05' and '2018-3-18' 
   and C.date between '2018-3-05' and '2018-3-18'; 
+------------+---------------+--------------------+---------+--------------------+
| totalsales | totalpurchase | grossprofit        | expence | netprofit          |
+------------+---------------+--------------------+---------+--------------------+
|   295433.6 |   132160.0000 | 163273.59999999998 |    1000 | 162273.59999999998 |
+------------+---------------+--------------------+---------+--------------------+

1 个答案:

答案 0 :(得分:0)

没有冒犯,但这显示了对连接如何工作和执行顺序的误解。 如果我们从这个

中取出总和并过滤掉
select *
  from A
     , B
     , C 
we get
+------------+-----------+------------+-----------+------------+--------+
| dte        | total     | dte        | total     | dte        | amount |
+------------+-----------+------------+-----------+------------+--------+
| 2018-02-27 |  64758.40 | 2018-02-12 |  26250.00 | 2018-03-17 | 500.00 |
| 2018-03-05 | 259033.60 | 2018-02-12 |  26250.00 | 2018-03-17 | 500.00 |
| 2018-03-05 |  36400.00 | 2018-02-12 |  26250.00 | 2018-03-17 | 500.00 |
| 2018-02-27 |  64758.40 | 2018-02-12 |  10600.00 | 2018-03-17 | 500.00 |
| 2018-03-05 | 259033.60 | 2018-02-12 |  10600.00 | 2018-03-17 | 500.00 |
| 2018-03-05 |  36400.00 | 2018-02-12 |  10600.00 | 2018-03-17 | 500.00 |
| 2018-02-27 |  64758.40 | 2017-05-07 | 165200.00 | 2018-03-17 | 500.00 |
| 2018-03-05 | 259033.60 | 2017-05-07 | 165200.00 | 2018-03-17 | 500.00 |
| 2018-03-05 |  36400.00 | 2017-05-07 | 165200.00 | 2018-03-17 | 500.00 |
| 2018-02-27 |  64758.40 | 2018-03-17 |  66080.00 | 2018-03-17 | 500.00 |
| 2018-03-05 | 259033.60 | 2018-03-17 |  66080.00 | 2018-03-17 | 500.00 |
| 2018-03-05 |  36400.00 | 2018-03-17 |  66080.00 | 2018-03-17 | 500.00 |
+------------+-----------+------------+-----------+------------+--------+
12 rows in set (0.00 sec)

带过滤器

select *
  from A
     , B
     , C 
 where A.dte between '2018-3-05' and '2018-3-18' 
   and B.dte between '2018-3-05' and '2018-3-18' 
   and C.dte between '2018-3-05' and '2018-3-18'; 

我们得到了

+------------+-----------+------------+----------+------------+--------+
| dte        | total     | dte        | total    | dte        | amount |
+------------+-----------+------------+----------+------------+--------+
| 2018-03-05 | 259033.60 | 2018-03-17 | 66080.00 | 2018-03-17 | 500.00 |
| 2018-03-05 |  36400.00 | 2018-03-17 | 66080.00 | 2018-03-17 | 500.00 |
+------------+-----------+------------+----------+------------+--------+
2 rows in set (0.00 sec)

这是预期的行为,但不是你想要的 在

中添加总和
select sum(A.total) as totalsales
     , sum(B.total) as totalpurchase
     , (sum(A.total)-sum(B.total)) as grossprofit
     , sum(C.amount) as expence
     , ((sum(A.total)-sum(B.total))-sum(C.amount)) as netprofit 
  from A
     cross join B
     cross join C 
 where A.dte between '2018-3-05' and '2018-3-18' 
   and B.dte between '2018-3-05' and '2018-3-18' 
   and C.dte between '2018-3-05' and '2018-3-18'; 

我们得到了

+------------+---------------+-------------+---------+-----------+
| totalsales | totalpurchase | grossprofit | expence | netprofit |
+------------+---------------+-------------+---------+-----------+
|  295433.60 |     132160.00 |   163273.60 | 1000.00 | 162273.60 |
+------------+---------------+-------------+---------+-----------+
1 row in set (0.00 sec)

一种方法可能是将总位包装在子查询中,然后执行其他位,例如

select Atotal as totalsales
     , Btotal as totalpurchase
     , Atotal-Btotal as grossprofit
     , Camount as expence
     , Atotal - Btotal - camount as netprofit 
from
(  
select (select sum(a.total) from a where A.dte between '2018-3-05' and '2018-3-18' ) atotal,
         (select sum(b.total) from b where b.dte between '2018-3-05' and '2018-3-18' ) btotal,
         (select sum(c.amount) from c where c.dte between '2018-3-05' and '2018-3-18' ) camount
from dual
) s

+------------+---------------+-------------+---------+-----------+
| totalsales | totalpurchase | grossprofit | expence | netprofit |
+------------+---------------+-------------+---------+-----------+
|  295433.60 |      66080.00 |   229353.60 |  500.00 | 228853.60 |
+------------+---------------+-------------+---------+-----------+
1 row in set (0.00 sec)