Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск одинаковых записей из двух запросов  [new]
laifik
Member

Откуда:
Сообщений: 190
У меня есть две таблицы с аналогичными столбцами. Но чтобы осуществить поиск одинаковых значений, нужно сначала данные привести к одному типу, а потом сравнивать. Поэтому мне сначала нужно написать 2 запроса, например:
автор
SELECT A.NOM,
A.GOST,
A.MASSA
FROM
(SELECT NOM,
LEFT(GostID, 2) AS GOST,
SUM(Massa) AS MASSA
FROM TABLE_1
GROUP BY NOM, LEFT(GostID, 2)
) A

Аналогично для таблицы TABLE_2

автор
SELECT B.NOM,
B.GOST,
B.MASSA
FROM
(SELECT NOM,
LEFT(GostID, 2) AS GOST,
SUM(Massa) AS MASSA
FROM TABLE_2
GROUP BY NOM, LEFT(GostID, 2)
) B

Данные в столбцах будут примерно такие:

QUERY_1
A.NOM A.GOST A.MASSA
1235 01 23.2
1456 01 8.5
2345 02 1.3
2655 06 10.5


QUERY_2
B.NOM B.GOST B.MASSA
1457 01 14.2
1456 01 57.5
1456 07 30.8
6645 02 41.3
2655 06 9.5


В результате должно получиться сравнение данных из запросов. Выглядеть в результативном запросе это должно так:

A.NOM B.NOM A.GOST B.GOST A.MASSA B.MASSA
1456 1456 01 01 8.5 57.5
1456 1456 0 07 0.0 30.8
2655 2655 06 06 10.5 9.5


Я пробовала с помощью объединения таблиц, но результат получается не такой, который нужен. Если номер повторяется несколько раз в другой таблице, то в первой он суммирует значение массы столько раз, сколько этого номера в другой таблице.

Пожалуйста, помогите с кодом. Пока я не могу придумать, как решить эту задачу. Заранее благодарю.
11 июн 14, 18:40    [16156541]     Ответить | Цитировать Сообщить модератору
 Re: Поиск одинаковых записей из двух запросов  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
laifik,

JOIN по NOM и GOST одновременно не даёт однозначного соответствия записей?

Что вы понимаете под "объединения таблиц"?
11 июн 14, 19:32    [16156689]     Ответить | Цитировать Сообщить модератору
 Re: Поиск одинаковых записей из двух запросов  [new]
laifik
Member

Откуда:
Сообщений: 190
1) Под объединением понимаю конструкцию INNER JOIN.
2) Не дает. Если в двух таблицах по одной записи одного и того же номера, то все прекрасно работает. Если в первой - одна запись, а во второй - больше одной, то массы суммируются каким-то непонятным образом. Поэтому я и решила преобразовать данные так, чтобы каждому NOM и GOST TABLE_1 соответствовало по одной записи NOM и GOST TABLE_2.
11 июн 14, 22:28    [16157190]     Ответить | Цитировать Сообщить модератору
 Re: Поиск одинаковых записей из двух запросов  [new]
SERG1257
Member

Откуда:
Сообщений: 2876
Лобовое решение

select *
from 
(
SELECT A.NOM,
A.GOST,
A.MASSA
FROM
(SELECT NOM,
LEFT(GostID, 2) AS GOST,
SUM(Massa) AS MASSA
FROM TABLE_1
GROUP BY NOM, LEFT(GostID, 2)
) A
) as QUERY_1 
join
(
SELECT B.NOM,
B.GOST,
B.MASSA
FROM
(SELECT NOM,
LEFT(GostID, 2) AS GOST,
SUM(Massa) AS MASSA
FROM TABLE_2
GROUP BY NOM, LEFT(GostID, 2)
) B
) as QUERY_2
on QUERY_1.NOM=QUERY_2.NOM and QUERY_1.GOST=QUERY_2.GOST
12 июн 14, 01:17    [16157732]     Ответить | Цитировать Сообщить модератору
 Re: Поиск одинаковых записей из двух запросов  [new]
SERG1257
Member

Откуда:
Сообщений: 2876
laifik
Под объединением понимаю конструкцию INNER JOIN.
Тогда почему у вас в ответе A.MASSA в средней строке 0.0 а не 8.5?
12 июн 14, 01:21    [16157735]     Ответить | Цитировать Сообщить модератору
 Re: Поиск одинаковых записей из двух запросов  [new]
laifik
Member

Откуда:
Сообщений: 190
Я сама сделала запрос, который выдает нужные мне данные . Ваше решение еще не смотрела - не было времени.
В том-то и дело, что я хотела бы получить все номера документов, которые есть в двух таблицах. Т. е., если Вы обратили внимание, то строка 1456 есть в первой таблице для GOST 01 и 07. Во второй таблице с этим же номером есть только GOST 01. Мой код ищет записи при полном совпадении NOM и GOST. Поэтому у меня в результате отсуствует NOM 1456 GOST 07. Видимо, как-то нужно написать условие, чтобы в результате бфла строка 1456 07 и масса = 0. Тогда сразу становится ясно, что номер документа в другой базе присутствует, а данных по массе нет.
Чтоб была понятна задача: есть две базы данных разных организаций, по которым прошли одинаковые документы. Нужно сравнить эти базы, чтобы выявить несоответствия.
Спасибо за помощь. Мне интересно Ваше решение, но хочу и сама додуматься. Таким образом, знаний становится побольше.
12 июн 14, 17:59    [16159198]     Ответить | Цитировать Сообщить модератору
 Re: Поиск одинаковых записей из двух запросов  [new]
SERG1257
Member

Откуда:
Сообщений: 2876
laifik
Ваше решение еще не смотрела - не было времени.
Я не мудрствуя лукаво обернул результаты ваших запросов как QUERY_1 и QUERY_2

laifik
чтобы в результате бфла строка 1456 07 и масса = 0
Используйте left join, получите null (не 0), а уже затем преобразуйте его isnull(MASSA,0)

laifik
Нужно сравнить эти базы, чтобы выявить несоответствия.
Тогда вам нужен не left join (когда одна база заведомо полнее другой), а FULL OUTER JOIN, который суть
select * 
from QUERY_1 as A
left join QUERY_2 as B on A.GOST=B.GOST
union
select * 
from QUERY_2 as B
left join QUERY_1 as A on A.GOST=B.GOST

http://technet.microsoft.com/en-us/library/ms187518(v=sql.105).aspx
12 июн 14, 18:26    [16159256]     Ответить | Цитировать Сообщить модератору
 Re: Поиск одинаковых записей из двух запросов  [new]
laifik
Member

Откуда:
Сообщений: 190
Да, я поняла, что нужно создавать два запроса с именами. Но не приходилось создавать имена дважды. Буду знать.
По моему и Вашему запросу получились разные результаты. Пока не поняла, почему. Буду разбираться.
Еще раз, огромное спасибо!
12 июн 14, 20:09    [16159475]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить