powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Неправильный результат при сумме с группировкой
11 сообщений из 11, страница 1 из 1
Неправильный результат при сумме с группировкой
    #39169621
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заметил такой феномен, что при вычислении в одном запросе двух сумм (входящих и исходящих) результат неправильный.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE `cargo_card` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT
  PRIMARY KEY (`id`),
) 

CREATE TABLE `incoming` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT
  `cargo_card_id` int(11) unsigned NOT NULL,
  `weight_incoming` DECIMAL
  PRIMARY KEY (`id`),
  CONSTRAINT `incoming_fk2` FOREIGN KEY (`cargo_card_id`) REFERENCES `cargo_card` (`id`),
) 

CREATE TABLE `outgoing` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT
  `cargo_card_id` int(11) unsigned NOT NULL,
  `weight_outgoing` DECIMAL
  PRIMARY KEY (`id`),
  CONSTRAINT `incoming_fk2` FOREIGN KEY (`cargo_card_id`) REFERENCES `cargo_card` (`id`),
) 



Необходимо составить запрос, отображающий общий вес пришедших и ушедших партий по каждой карточке груза.
Код: sql
1.
2.
3.
4.
5.
SELECT cc.id, SUM(i.weight_incoming), SUM(o.weight_outgoing)
FROM cargo_card cc
INNER JOIN incoming i ON i.cargo_card_id = cc.id
LEFT JOIN outgoing o ON o.cargo_card_id = cc.id
GROUP BY cc.id


Так вот, запрос отображает неправильные суммы.

Когда создаю два отдельных запроса, на incoming и на outgoing, то каждый из них отображает правильные суммы.
Код: sql
1.
2.
3.
4.
SELECT cc.id, SUM(i.weight_incoming)
FROM cargo_card cc
INNER JOIN incoming i ON i.cargo_card_id = cc.id
GROUP BY cc.id



Код: sql
1.
2.
3.
4.
SELECT cc.id, SUM(o.weight_outgoing)
FROM cargo_card cc
LEFT JOIN outgoing o ON o.cargo_card_id = cc.id
GROUP BY cc.id



Почему так??
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39169644
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvlad,

Дополнительные JOIN-ы дают больше дублирующихся записей до группировки.
Уберите суммирование и группировку, увидите сами.

Я бы сделал без группировки подзапросами в списке SELECT.
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39169645
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно можно написать вложенный запрос



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT cc.id, SUM(i.weight_incoming),

    (SELECT SUM(o.weight_outgoing)
     FROM outgoing o
     WHERE o.cargo_card_id = cc.id) AS sum_out

FROM cargo_card cc
INNER JOIN incoming i ON i.cargo_card_id = cc.id
GROUP BY cc.id



Тогда правильно отображает. Но что делать, если нужно вычислить разницу между суммой входящих и суммой исходящих (остаток)??

Вот так ругается на синтаксис:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT cc.id, 

SUM(i.weight_incoming) -
    (SELECT SUM(o.weight_outgoing)
     FROM outgoing o
     WHERE o.cargo_card_id = cc.id) AS weight_remains

FROM cargo_card cc
INNER JOIN incoming i ON i.cargo_card_id = cc.id
GROUP BY cc.id
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39169652
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SELECT cc.id, 
(SELECT SUM(weight_incoming) FROM incoming i WHERE i.cargo_card_id = cc.id) sum_i,
(SELECT SUM(weight_outgoing) FROM outgoing o WHERE o.cargo_card_id = cc.id) sum_o
FROM cargo_card cc


А дальше крутите как хотите:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT t.*, sum_i - sum_o delta 
FROM (
SELECT cc.id, 
(SELECT SUM(weight_incoming) FROM incoming i WHERE i.cargo_card_id = cc.id) sum_i,
(SELECT SUM(weight_outgoing) FROM outgoing o WHERE o.cargo_card_id = cc.id) sum_o
FROM cargo_card cc
) t
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39169664
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

О, спасибо!

Но тут, получается, не вполне осознано базовое понимание JOIN-ов.
Я как рассуждаю: если есть 3 таблицы, со следующими значениями:

cargo_card
id
1
2

incoming
id cargo_card_id
1 1

outgoing
id cargo_card_id
1 2

То запрос
Код: sql
1.
2.
3.
4.
SELECT cc.id, i.id, o.id
FROM cargo_card cc
LEFT JOIN incoming i ON i.cargo_card_id = cc.id
LEFT JOIN outgoing o ON o.cargo_card_id = cc.id



должен выдать:
cc.id i.id o.id
1 1 null
2 null 2

Но в реальности выдает больше. Что-то здесь не так.
На самом деле выдает что-то типа этого:
cc.id i.id o.id
1 1 2
1 1 2
2 1 2
2 1 2

Но какого фига он дублирует те значения вторичных таблиц, которые к данному id не относятся?
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39169668
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. как будто CROSS JOIN получается.
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39169694
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
svnvladНо в реальности выдает больше. Что-то здесь не так.
На самом деле выдает что-то типа этого:Не должно такого быть. Сделайте такие таблички и покажите натурный эксперимент.
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39169730
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, не надо коррелированных подзапросов, а? делайте полные подзапросы по таблицам incoming и outgoing (кстати, а хрен ли их две, сущность-то одна!), а потом уже вяжите на основную таблицу. Шаблонно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select c.id, inc.sum_i, out.sum_o
from cargo с
left join 
(
  select id, sum(val) sum_i
  from incoming 
  group by id
) inc 
on inc.id = c.id
left join
(
  select id, sum(val) sum_o
  from outgoing 
  group by id
) out
on out.id = c.id
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39169808
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaМожет, не надо коррелированных подзапросов, а?Это зависит от.
Если из таблицы cargo в итоге нужны все или почти все записи, то да, лучше джойнить с подзапросами.
А если нужны всего одна или несколько записей, то, думаю, мой вариант будет лучше.
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39169814
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaподзапросы по таблицам incoming и outgoing (кстати, а хрен ли их две, сущность-то одна!)

На самом деле там одна таблица с полями from_cargo_card_id и to_cargo_card_id. Это для примера я их разделил, чтобы легче понимать было.
...
Рейтинг: 0 / 0
Неправильный результат при сумме с группировкой
    #39170133
svnvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, сегодня много полезного узнал.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Неправильный результат при сумме с группировкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]