Sum()在连接多个表时返回不正确的值

时间:2017-12-11 10:47:28

标签: mysql sum

我有四张桌子:

表格订单:

o_id    o_c_id  o_type      o_date
1       23    TA          2015-01-01
2       24    TA          2015-01-16
3       25    GA          2015-01-08
4       26    TA          2016-01-24
5       26    FB          2016-01-28

表客户:

c_id    c_name  c_email
23       Ander   xxx@gmail.com          
24       Kay     xxx@gmail.com
25       Bob     xxx@gmail.com
26       Devi    xxx@gmail.com

表服务:

s_o_id    s_name  s_nr  s_amount
1       SGHH   75454645   350     
1       SGHH   75454645   420
2       TAK    74322411   214
3       BGH    74288442   850

表外部:

ext_id ext_name ext_nr  ext_amount
1      Gerry   75454645   350
1      Gerry   75454645   420
2      Alby    74322411   214
3      Alby    74288442   850

结果应如下所示:

| c_name   | o_date        | ext_name |  ext_nr  |   s_nr    | ext_amount | s_amount |
|----------|---------------|----------|----------|-----------|------------|----------|
| Ander    | 2016-09-19    | Gerry    | 75454645 | 75454645  |   760      |  730     |

我的查询:

SELECT c.c_name
     , o.o_date 
     , s.s_name
     , ext.ext_nr
     , s.s_nr
     , SUM(ext.ext_amount) 
     , SUM(s.s_amount) 
  FROM orders o
  JOIN customer c 
    ON o.c_id = c.c_id
  JOIN services s 
    ON s.o_id = o.o_id
 RIGHT 
  JOIN external ext 
    ON ext.ext_nr = s.s_nr
 GROUP 
    BY s.s_nr;

返回的不同nr的金额总和不正确,我认为是因为连接。

2 个答案:

答案 0 :(得分:0)

您应该使用JOIN(默认为INNER JOIN),并添加group by子句中的所有列,但聚合列除外:

SELECT c.c_name
 , o.o_date 
 , s.s_name
 , ext.ext_nr
 , s.s_nr
 , SUM(ext.ext_amount) 
 , SUM(s.s_amount) 
FROM orders o
JOIN customer c 
ON o.c_id = c.c_id
JOIN services s 
ON s.o_id = o.o_id
JOIN external ext 
ON ext.ext_nr = s.s_nr
GROUP BY
   c.c_name
 , o.o_date 
 , s.s_name
 , ext.ext_nr
 , s.s_nr;

有关在sql click here

中使用联接的更多信息

答案 1 :(得分:0)

外部和服务之间的连接有2行,链接到相同的共享值75454645.这将在结果集中产生额外的行(我认为总共4行中的6行)。