Sum () возвращает неверное значение при объединении нескольких таблиц

0

У меня четыре таблицы:

Таблица заказов:

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   [email protected]          
24       Kay     [email protected]
25       Bob     [email protected]
26       Devi    [email protected]

Столовые сервисы:

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 возвращенных некорректна, я предполагаю, что это из-за объединений.

Теги:
sum

2 ответа

0

Вы должны использовать JOIN (который по умолчанию использует INNER JOIN), и добавить все столбцы в группе по предложению excep агрегированных столбцов:

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, нажмите здесь.

  • 0
    я попробовал это с внутренним соединением вместо правильного соединения и сгруппировал это, как вы предложили, но набор результатов не изменился
0

Соединение между внешним и сервисом имеет 2 строки со ссылками на одно и то же общее значение, 75454645. Это приведет к появлению дополнительных строк в результирующем наборе (по моему мнению, всего 6 строк из 4).

  • 0
    как мне это решить?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню