У меня четыре таблицы:
Таблица заказов:
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 возвращенных некорректна, я предполагаю, что это из-за объединений.
Вы должны использовать 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, нажмите здесь.
Соединение между внешним и сервисом имеет 2 строки со ссылками на одно и то же общее значение, 75454645. Это приведет к появлению дополнительных строк в результирующем наборе (по моему мнению, всего 6 строк из 4).