У меня есть SQL-запрос, который объединяет несколько таблиц и создает дубликаты в двух строках. Я использую ключевое слово DISTINCT для устранения дубликатов:
SELECT DISTINCT
o.day as day,
g.id AS id,
g.name AS name,
o.num AS num,
o.version as version
FROM
table_one o
INNER JOIN table_two t ON
o.ID = t.ID
INNER JOIN table_three g ON
t.ID = g.ID
INNER JOIN table_four gs ON
g.ID = gs.ID
AND
INNER JOIN table_five s ON
gs.ID = s.ID
INNER JOIN table_six z ON
s.ID = z.ID
INNER JOIN table_seven bg ON
bg.ID = g.ID;
Это возвращает две строки, как мне бы хотелось, иначе я бы увидел дубликаты, если бы не использовал DISTINCT:
1/2/19, 5, first, 25, 1
1/5/19, 7, second, 20, 1
Если я уберу DISTINCT, то две строки будут продублированы, что даст мне четыре строки:
1/2/19, 5, first, 25, 1
1/2/19, 5, first, 25, 1
1/5/19, 7, second, 20, 1
1/5/19, 7, second, 20, 1
Итак, моя конечная цель — использовать функцию GROUP BY, чтобы я мог сложить свое поле o.num и сгруппировать их по остальным полям. Если я добавлю функцию GROUP BY к приведенному выше запросу, например:
SELECT DISTINCT
o.day as day,
g.id AS id,
g.name AS name,
SUM(o.num) AS num,
o.version as version
FROM
table_one o
INNER JOIN table_two t ON
o.ID = t.ID
INNER JOIN table_three g ON
t.ID = g.ID
INNER JOIN table_four gs ON
g.ID = gs.ID
AND
INNER JOIN table_five s ON
gs.ID = s.ID
INNER JOIN table_six z ON
s.ID = z.ID
INNER JOIN table_seven bg ON
bg.ID = g.ID
GROUP BY
o.day as day,
g.id AS id,
g.name AS name,
o.version as version;
Я возвращаю две строки назад, но сумма o.num удваивается (по сути, выполняется GROUP BY без DISTINCT:
1/2/19, 5, first, 50, 1
1/5/19, 7, second, 40, 1
ПРИМЕЧАНИЕ. Вам может быть интересно, почему я пытаюсь использовать GROUP BY, когда получаю нужные результаты с первым запросом. Я включил только те строки, которые дублируются. По какой-то причине все остальные строки не видят этого поведения. Есть ли способ заставить GROUP BY и DISTINCT работать вместе?
@Lamak да, так что мой вопрос в том, как это исправить


Если вы хотите удалить дубликаты, а затем суммировать значения, вставьте свой запрос в подзапрос.
select day, id, name, sum(num) num, version
from (
-- your query here with DISTINCT clause
)
group by day, id, name, version
Если вы получаете дубликаты, могут возникнуть проблемы с условиями присоединения. Мне не трудно судить, не знаю датасетов.
Вы можете использовать SUM(DISTINCT o.num):
SELECT o.day as day,
g.id AS id,
g.name AS name,
SUM(DISTINCT o.num) AS num,
o.version as version
FROM table_one o
INNER JOIN table_two t ON o.ID = t.ID
INNER JOIN table_three g ON t.ID = g.ID
INNER JOIN table_four gs ON g.ID = gs.ID
INNER JOIN table_five s ON gs.ID = s.ID
INNER JOIN table_six z ON s.ID = z.ID
INNER JOIN table_seven bg ON bg.ID = g.ID
GROUP BY o.day as day,
g.id AS id,
g.name AS name,
o.version as version;
ну… да, вы группируете исходный набор данных и используете сумму по дублированным значениям