使用SUM和JOIN查询发现意外的SUM结果

时间:2019-05-22 06:52:43

标签: mysql sql

我有两个表“ tbl_orders”和“ tbl_instore”。 tbl_orders具有“ sel_product_qty”,我想及时确定SUM,表(tbl_instore)具有“ inst_prod_qty”和“ chln_amount”,我计算并希望获得购买的单价。但是,当我在这两个表上使用联接查询时,SUM(sel_product_qty)会从预期结果中产生两倍,三倍和四倍的量。

样本数据表是..

表“ tbl_order”:

+----------+------------+------------+-----------------+---------------+--------------------+
| order_id | ord_det_id | product_id | sel_product_qty | selling_price |   order_date_time  |
+----------+------------+------------+-----------------+---------------+--------------------+
|  3       |     1      |      4     |       50        |     67.82     | 2019-03-21 21:52:21|
|  4       |     1      |      1     |       100       |     37.88     | 2019-03-21 21:52:21|
|  5       |     2      |      4     |       120       |     67.82     | 2018-03-23 00:02:36|
|  6       |     3      |      3     |       300       |     123.67    | 2019-03-23 00:04:38|
|  7       |     3      |      2     |       50        |     76.28     | 2019-03-23 00:04:38|
|  8       |     4      |      4     |       50        |     67.82     | 2019-03-24 12:13:06|
|  9       |     4      |      2     |       100       |     76.28     | 2019-03-24 12:13:06|
|  10      |     5      |      1     |       10        |     37.88     | 2019-03-25 12:56:40|
|  11      |     5      |      4     |       7         |     67.82     | 2019-03-25 12:56:40|
|  12      |     6      |      4     |       23        |     67.82     | 2019-03-29 00:29:14|
|  13      |     6      |      2     |       25        |     76.28     | 2019-03-29 00:29:14|
|  16      |     7      |      1     |       120       |     37.88     | 2019-04-14 16:51:10|
|  17      |     7      |      3     |       90        |     123.67    | 2019-04-14 16:51:11|
|  18      |     8      |      1     |       100       |     66.95     | 2019-04-22 23:30:39|
|  19      |     8      |      2     |       22        |     70.04     | 2019-04-22 23:30:39|
+----------+------------+------------+-----------------+---------------+--------------------+

表“ tbl_instore”:

+----------+----------+------------+---------------+-------------+--------------------+
| in_st_id | s_inv_id | product_id | inst_prod_qty | chln_amount |  instore_date_time |
+----------+----------+------------+---------------+-------------+--------------------+
|    1     |    1     |     1      |    1000       |    65852    |  2/14/2018 17:28   |
|    14    |    9     |     1      |    100        |    6400     |  4/26/2019 8:26    |
|    3     |    2     |     1      |    2000       |    58885    |  3/19/2019 17:32   |
|    5     |    3     |     1      |    100        |    3588     |  3/19/2019 17:35   |
|    11    |    7     |     1      |    1000       |    65000    |  4/22/2019 23:17   |
|    9     |    5     |     1      |    100        |    6345     |  4/20/2019 0:13    |
|    12    |    8     |     2      |    100        |    7800     |  4/22/2019 23:20   |
|    8     |    4     |     2      |    2000       |    144567   |  3/23/2019 0:04    |
|    7     |    4     |     3      |    1000       |    121665   |  3/23/2019 0:04    |
|    13    |    8     |     3      |    150        |    32000    |  4/22/2019 23:20   |
|    15    |    9     |     3      |    100        |    19000    |  4/26/2019 8:26    |
|    10    |    6     |     4      |    1000       |    88022    |  4/20/2019 0:16    |
|    6     |    3     |     4      |    100        |    6582     |  3/19/2019 17:35   |
|    4     |    2     |     4      |    1000       |    65882    |  3/19/2019 17:32   |
|    2     |    1     |     4      |    5000       |    359877   |  2/14/2018 17:28   |
+----------+----------+------------+---------------+-------------+--------------------+

我目前已经尝试过以下查询:

SELECT SUM(tbl_orders.sel_product_qty) AS `sel_prod_qty`,
(SUM(chln_amount) / SUM(inst_prod_qty)) AS `pur_uni_price`, 
            date_format(`order_date_time`, '%M-%Y') as `month`, 
            tbl_orders.product_id AS `product_id`
            FROM tbl_orders
            INNER JOIN tbl_instore ON tbl_instore.product_id = tbl_orders.product_id
            WHERE YEAR(`order_date_time`)= '2019' 
            GROUP BY `month`, `product_id`;

返回以下结果:

+--------------+---------------+--------+------------+
| sel_prod_qty | pur_uni_price | month  | product_id |
+--------------+---------------+--------+------------+
|     1320     |    47.923256  | Apr-19 |     1      |
+--------------+---------------+--------+------------+
|     44       |    72.555714  | Apr-19 |     2      |
+--------------+---------------+--------+------------+
|     270      |    138.132    | Apr-19 |     3      |
+--------------+---------------+--------+------------+
|     660      |    47.923256  | Mar-19 |     1      |
+--------------+---------------+--------+------------+
|     350      |    72.555714  | Mar-19 |     2      |
+--------------+---------------+--------+------------+
|     900      |    138.132    | Mar-19 |     3      |
+--------------+---------------+--------+------------+
|     520      |    73.290563  | Mar-19 |     4      |
+--------------+---------------+--------+------------+

如果我在没有JOIN的情况下单独运行查询,我将得到如下的SUM(sel_prod_qty)值(也是我的预期结果):

+--------------+---------------+--------+------------+
| sel_prod_qty | pur_uni_price | month  | product_id |
+--------------+---------------+--------+------------+
|     220      |    47.923256  | Apr-19 |     1      |
+--------------+---------------+--------+------------+
|     22       |    72.555714  | Apr-19 |     2      |
+--------------+---------------+--------+------------+
|     90       |    138.132    | Apr-19 |     3      |
+--------------+---------------+--------+------------+
|     110      |    47.923256  | Mar-19 |     1      |
+--------------+---------------+--------+------------+
|     175      |    72.555714  | Mar-19 |     2      |
+--------------+---------------+--------+------------+
|     300      |    138.132    | Mar-19 |     3      |
+--------------+---------------+--------+------------+
|     130      |    73.290563  | Mar-19 |     4      |
+--------------+---------------+--------+------------+

所以,我的问题是,为什么我的查询从预期结果返回SUM(sel_product_qty)的两倍,三倍和四倍?

2 个答案:

答案 0 :(得分:0)

pur_uni_price字段不再是聚合字段,因此您需要将其添加到GROUP BY。参见下面的代码

SELECT SUM(tbl_orders.sel_product_qty) AS `sel_prod_qty`,
    (SUM(chln_amount) / SUM(inst_prod_qty)) AS `pur_uni_price`, 
    date_format(`order_date_time`, '%M-%Y') as `month`, 
    tbl_orders.product_id AS `product_id`
    FROM tbl_orders
    INNER JOIN tbl_instore ON tbl_instore.product_id = tbl_orders.product_id
    WHERE YEAR(`order_date_time`)= '2019' 
    GROUP BY `month`, `product_id`, (SUM(chln_amount) / SUM(inst_prod_qty))

答案 1 :(得分:0)

尝试一下:

SELECT `sel_prod_qty`,
       `pur_uni_price`, 
       `month`, 
        orders.product_id AS `product_id`
     FROM  
        (SELECT product_id,SUM(sel_product_qty) AS `sel_prod_qty`,
                DATE_FORMAT(`order_date_time`, '%M-%Y') AS `month` 
           FROM tbl_orders 
          WHERE YEAR(`order_date_time`)='2019' 
         GROUP BY `month`, `product_id`) orders
     INNER JOIN 
         (SELECT product_id,(SUM(chln_amount) / SUM(inst_prod_qty)) AS `pur_uni_price` 
            FROM tbl_instore GROUP BY product_id) instore 
              ON orders.product_id=instore.product_id;

我从您加入的那些表中创建了两个子查询,因为行不通是您在做INNER JOIN ... ON tbl_instore.product_id = tbl_orders.product_id。如果您返回表,则会在两个表中多次重复这些值。因此,此子查询将执行数学运算,而外部查询将仅从中返回结果。