Подзапрос SQL Соединение и Сумма

У меня есть таблицы 1 и 2 с общим идентификатором имени столбца в обоих.

Таблица 1 содержит повторяющиеся записи строк, которые я смог обрезать, используя:

SELECT DISTINCT 

Таблица 2 содержит повторяющиеся числовые записи (в долларах) для идентификаторов, которые мне были нужны, и я смог подвести итог:

Table 1         Table 2 
------------   ------------------
ID     spec    ID       Dol1     Dol2
54      A      54        1         0
54      A      54        2         1
55      B      55        0         2
56      C      55        3         0

-Мне нужно объединить эти два запроса в один, поэтому я получаю результирующее объединение идентификатора столбца таблицы 1 и таблицы 2 ON, (a) без дубликатов в таблице 1 & (b) Суммированные значения $ из таблицы 2

Например:

NewTable
----------------------------------------
ID     Spec          Dol1           Dol2
54      A             3               1
55      B             3               2

Примечания: количество строк в таблицах 1 и 2 не совпадает.

Спасибо

3 ответа

Решение

Используйте производную таблицу, чтобы получить отличные значения из таблицы 1, и просто присоединитесь к таблице 2 и используйте агрегирование.

Проблема в том, что у вас есть отношение M:M между таблицей 1 и таблицей 2. Вам нужно, чтобы это было 1:M, чтобы сумма была точной. Таким образом, мы извлекаем t1 из таблицы1, используя отдельный отбор, чтобы дать нам уникальные записи в отношении 1:M (при условии, что спецификации одинаковы для каждого идентификатора)

SELECT T1.ID, T1.Spec, Sum(T2.Dol1) as Dol1, sum(T2.Dol2) as Dol2
FROM (SELECT distinct ID, spec
      FROM table1) T1
INNER JOIN table2 T2
 on t2.ID = T1.ID
GROUP BY T1.ID, T1.Spec

Это предполагает, что вы хотите только записи, которые существуют в обоих. В противном случае нам может понадобиться использовать внешнее соединение (ВЛЕВО, ВПРАВО или ПОЛНОЕ); в зависимости от желаемых результатов.

Я не могу видеть ваши данные, но вы можете попробовать:

SELECT DISTINCT ID
FROM TblOne

UNION ALL

SELECT DISTINCT ID, SUM(Dol)
FROM TblTwo
GROUP BY ID

Предварительно агрегируйте таблицу 2 и затем присоединитесь:

select t1.id, t1.spec, t2.dol1, t2.dol2
from (select t2.id, sum(dol1) as dol1, sum(dol2) as dol2
      from table2 t2
      group by t2.id
     ) t2 join
     (select distinct t1.id, t1.spec
      from table1 t1
     ) t1
     on t1.id = t2.id;

Для ваших примеров данных вам не нужно предварительно агрегировать таблицу 2. Это дает правильные суммы - хотя и в нескольких строках - если table1 имеет несколько спецификаций для данного идентификатора.

Другие вопросы по тегам