Функция GROUP BY отменяет DISTINCT - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть 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 работать вместе?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать 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;
0 голосов
/ 28 февраля 2019

Если вы хотите удалить дубликаты, а затем суммировать значения, вставьте свой запрос в подзапрос.

select day, id, name, sum(num) num, version
from (
  -- your query here with DISTINCT clause 
)
group by day, id, name, version

Если вы получили дубликаты, могут возникнуть некоторые проблемы с условиями соединения.Мне не сложно судить, не знаю наборов данных.

...