Подзапрос 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
имеет несколько спецификаций для данного идентификатора.