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

Откуда:
Сообщений: 2260
Здравствуйте!
Нужна помощь в написании SQL-запроса.

Есть таблица 1. Отгрузки
Код_ТТ Привязанный_cписокSKU_не_объедОтгрузки
ТТ1Список1SKU1_20
ТТ1Список1SKU3_32
ТТ2Список1SKU1_10
ТТ2Список1SKU2_22
ТТ2Список1SKU5_8
ТТ3Список2SKU1_27
ТТ3Список2SKU2_28
ТТ3Список2SKU3_11
ТТ3Список2SKU4_12
ТТ3Список2SKU7_13


Есть таблица 2. Здесь для каждого номера списка указываются SKU, которые надо обязательно отгрузить.
Номер_списка SKU_не_объедSKU_Объед
Список1SKU1_SKU1
Список1SKU2_SKU2
Список1SKU3_SKU3 + SKU4
Список1SKU4_SKU3 + SKU4
Список2SKU1_SKU1
Список2SKU2_SKU2
Список2SKU3_SKU3 + SKU4
Список2SKU4_SKU3 + SKU4
Список2SKU5_SKU5
Список2SKU6_SKU6


Условия соединения таблиц:
1. Если отгруженный SKU есть в соответствующем списке, то выводится в результирующую таблицу.
2. Если SKU присутствует в списке, но не было отгружено, то в результирующую таблицу выводиться, но с нулевыми отгрузками.
3. Если SKU не в списке, но были отгрузки, то в результируюущую таблицу выводим это SKU с отгрузками. Выделено голубым цветом.

Обратите внимание, что
1. Присутствуют два поля "SKU_не_объед" (в конце нижнее подчеркивание) и "SKU_Объед", здесь сущность "Многие к одному". Выделено жирным шрифтом.
2. В результирующей таблице, если SKU в списке, то отображается как "SKU_объед", иначе SKU как "SKU_не_объед" (выделено голубым цветом).

Нужно получить такой результат
Код_ТТ Привязанный _списокSKUСтатус_SKUОтгрузки
ТТ1Список1SKU1В списке20
ТТ1Список1SKU2В списке
ТТ1Список1SKU3+SKU4В списке32
ТТ2Список1SKU1В списке10
ТТ2Список1SKU2В списке22
ТТ2Список1SKU3 + SKU4В списке
ТТ2Список1SKU5_Не в списке8
ТТ3Список1SKU1В списке27
ТТ3Список2SKU2В списке28
ТТ3Список2SKU3+SKU4В списке23
ТТ3Список2SKU5В списке
ТТ3Список2SKU6В списке
ТТ3Список2SKU7_Не в списке13

Пишу SQL-запрос

Первый этап. Здесь я получаю туже самую таблицу 1, но с дополнительным полем "SKU_Объед"
SELECT
    Т1.ТТ,
    Т1.Привязанный_cписок,
    Т1.SKU_не_объед,
    Т2.SKU_объед,
    Т1.Отгрузки
From
    Таблица1 AS Т1
LEFT JOIN
    Таблица2 AS Т2
ON
    Т1.Привязанный_cписок=Т2.Номер_cписка
    AND
    Т1.SKU_не_объед = Т2.SKU_не_объед
Но здесь отсутствуют строки - SKU, по которым не было отгрузок, но присутствуют в соответствующем списке..

Второй этап. Добавление этих строк.
Вот тут и запутался. То ли здесь надо разность множеств использовать, то ли как то по другому.
26 май 16, 15:09    [19223633]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2576
=ferzmikk
Если SKU присутствует в списке, но не было отгружено
Расшифруйте, как это?
26 май 16, 15:31    [19223763]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
Lavrov_Yura
Member

Откуда:
Сообщений: 34
PaulYoung,

это значит есть во второй таблице, но нет в первой, например Список1 SKU2

ferzmikk,

а не опечатка ли тут?
ТТ3 Список2 SKU1_ 27 - табл 1
ТТ3 Список1 SKU1 В списке 27 - треб. результат
26 май 16, 16:18    [19224059]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2576
=Lavrov_Yura
это значит есть во второй таблице, но нет в первой, например Список1 SKU2
прицепить UNION соответствующей выборки из табл. 2 к первому запросу
26 май 16, 16:42    [19224209]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
ferzmikk
Member

Откуда:
Сообщений: 2260
Lavrov_Yura
PaulYoung,

это значит есть во второй таблице, но нет в первой, например Список1 SKU2

ferzmikk,

а не опечатка ли тут?
ТТ3 Список2 SKU1_ 27 - табл 1
ТТ3 Список1 SKU1 В списке 27 - треб. результат

Да, опечатка.
Нужно получить такой результат
Код_ТТ Привязанный _списокSKUСтатус_SKUОтгрузки
ТТ1Список1SKU1В списке20
ТТ1Список1SKU2В списке
ТТ1Список1SKU3+SKU4В списке32
ТТ2Список1SKU1В списке10
ТТ2Список1SKU2В списке22
ТТ2Список1SKU3 + SKU4В списке
ТТ2Список1SKU5_Не в списке8
ТТ3Список2SKU1В списке27
ТТ3Список2SKU2В списке28
ТТ3Список2SKU3+SKU4В списке23
ТТ3Список2SKU5В списке
ТТ3Список2SKU6В списке
ТТ3Список2SKU7_Не в списке13
26 май 16, 16:49    [19224249]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
ferzmikk
Member

Откуда:
Сообщений: 2260
PaulYoung
=Lavrov_Yura
это значит есть во второй таблице, но нет в первой, например Список1 SKU2
прицепить UNION соответствующей выборки из табл. 2 к первому запросу

Во второй таблице нету поля "ТТ". Если я не ошибаюсь, то Union надо использовать когда количество и порядок столбцов должны быть одинаковыми во всех запросах.
26 май 16, 17:05    [19224358]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
ferzmikk
PaulYoung
пропущено...
прицепить UNION соответствующей выборки из табл. 2 к первому запросу

Во второй таблице нету поля "ТТ". Если я не ошибаюсь, то Union надо использовать когда количество и порядок столбцов должны быть одинаковыми во всех запросах.

нарисуйте любое, NULL например
26 май 16, 17:30    [19224368]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
ferzmikk
Member

Откуда:
Сообщений: 2260
TaPaK
нарисуйте любое, NULL например

Тогда получиться, что в полях "ТТ" будет null. А надо чтобы были заполнены
Код_ТТ Привязанный_cписокSKU_не_объедОтгрузкиSKU_не_объед(из табл 2)SKU_Объед(из табл 2)
ТТ1Список1SKU1_20SKU1_SKU1
Список1SKU2_SKU2
ТТ1Список1SKU3_32SKU3_SKU3 + SKU4
Список1SKU4_SKU3 + SKU4
ТТ2Список1SKU1_10SKU1_SKU1
ТТ2Список1SKU2_22SKU2_SKU2
Список1SKU3_SKU3 + SKU4
Список1SKU4_SKU3 + SKU4
ТТ2Список1SKU5_8
ТТ3Список2SKU1_27SKU1_SKU1
ТТ3Список2SKU2_28SKU2_SKU2
ТТ3Список2SKU3_11SKU3_SKU3 + SKU3
ТТ3Список2SKU4_12SKU4_SKU4 + SKU4
Список2SKU5_SKU5
Список2SKU6_SKU6
ТТ3Список2SKU7_13

Может быть я что то не так понял?
26 май 16, 17:54    [19224521]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
PaulYoung
Member

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

а как вы все же определяете, какие записи из табл. 2 отсутствуют в табл. 1? Я вижу связь только по "Номер_списка/Привязанный_cписок" и "SKU_не_объед". Вот, например, в табл. 2 есть запись "Список1, SKU2_". Она есть в табл.1? И какой у неё должен быть "Код_ТТ"?
26 май 16, 18:18    [19224627]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
ferzmikk
Member

Откуда:
Сообщений: 2260
PaulYoung
ferzmikk,

а как вы все же определяете, какие записи из табл. 2 отсутствуют в табл. 1? Я вижу связь только по "Номер_списка/Привязанный_cписок" и "SKU_не_объед". Вот, например, в табл. 2 есть запись "Список1, SKU2_". Она есть в табл.1? И какой у неё должен быть "Код_ТТ"?

Получиться null.
А как мне тогда получить ту конечную таблицу, которая мне нужна?
26 май 16, 18:27    [19224656]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
PaulYoung
Member

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

выбрать для таких записей все "Коды_ТТ" из табл. 1, для которых не найдена связь "Список-SKU"
26 май 16, 18:50    [19224752]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
ferzmikk
Member

Откуда:
Сообщений: 2260
PaulYoung
ferzmikk,

выбрать для таких записей все "Коды_ТТ" из табл. 1, для которых не найдена связь "Список-SKU"

Вы имеете ввиду про такой запрос, который выгружает те записи, которые не нашел во второй таблице?

SELECT
    Т1.ТТ,
    Т1.Привязанный_cписок,
    Т1.SKU_не_объед,
    Т2.SKU_не_объед,
    Т2.SKU_объед,
    Т1.Отгрузки
From
    Таблица1 AS Т1
LEFT JOIN
    Таблица2 AS Т2
ON
    Т1.Привязанный_cписок=Т2.Номер_cписка
    AND
    Т1.SKU_не_объед = Т2.SKU_не_объед
WHERE
    (Т2.Номер_cписка IS NULL
    AND
    Т2.SKU_не_объед IS NULL)

Результат
Код_ТТ Привязанный_cписокSKU_не_объедSKU_не_объед(из табл 2)SKU_Объед(из табл 2)Отгрузки
ТТ2Список1SKU5_8
ТТ3Список2SKU7_13
27 май 16, 08:21    [19226249]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
Lavrov_Yura
Member

Откуда:
Сообщений: 34
а я ошибся, Список1 SKU2 есть в первой таблице, но с кодом ТТ2, а в треб. результате с кодом ТТ2 и с кодом ТТ1. И по какому параметру их множить?
Вообще логика интересная, вот только требуемый результат местами бредовый, его бы привести в удобоваримое состояние.
27 май 16, 08:27    [19226256]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
ferzmikk
Member

Откуда:
Сообщений: 2260
Lavrov_Yura
Список1 SKU2 есть в первой таблице, но с кодом ТТ2, а в треб. результате с кодом ТТ2 и с кодом ТТ1. И по какому параметру их множить?

Не понял вопроса
27 май 16, 08:37    [19226277]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
Lavrov_Yura
Member

Откуда:
Сообщений: 34
ferzmikk,


табл 1
ТТ2 Список1 SKU2_ 22

табл 2
Список1 SKU2_ SKU2

треб. рез-т:
ТТ2 Список1 SKU2 В списке 22
ТТ1 Список1 SKU2 В списке - - эта строка по какому принципу должна формироваться?
27 май 16, 09:25    [19226457]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
ferzmikk
Member

Откуда:
Сообщений: 2260
Lavrov_Yura
ferzmikk,


табл 1
ТТ2 Список1 SKU2_ 22

табл 2
Список1 SKU2_ SKU2

треб. рез-т:
ТТ2 Список1 SKU2 В списке 22
ТТ1 Список1 SKU2 В списке - - эта строка по какому принципу должна формироваться?

Я думаю где то на промежуточном этапе использовать такой запрос
SELECT
    Т1.ТТ,
    Т1.Привязанный_cписок,
    Т2.SKU_не_объед,
    Т2.SKU_объед
FROM
    (SELECT DISTINC
	Т1.ТТ,
	Т1.Привязанный_cписок
    FROM
    	Таблица1 AS Т1) AS Т1
INNER JOIN
    Таблица2 AS Т2
ON
    Т1.Привязанный_cписок=Т2.Номер_cписка

Результат
ТТПривязанный_cписок SKU_не_объедSKU_Объед
ТТ1Список1SKU1_SKU1
ТТ1Список1SKU2_SKU2
ТТ1Список1SKU3_SKU3 + SKU4
ТТ1Список1SKU4_SKU3 + SKU4
ТТ2Список2SKU1_SKU1
ТТ2Список2SKU2_SKU2
ТТ2Список2SKU3_SKU3 + SKU4
ТТ2Список2SKU4_SKU3 + SKU4
ТТ2Список2SKU5_SKU5
ТТ2Список2SKU6_SKU6
ТТ3Список2SKU1_SKU1
ТТ3Список2SKU2_SKU2
ТТ3Список2SKU3_SKU3 + SKU4
ТТ3Список2SKU4_SKU3 + SKU4
ТТ3Список2SKU5_SKU5
ТТ3Список2SKU6_SKU6
27 май 16, 11:42    [19227186]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
Lavrov_Yura
Member

Откуда:
Сообщений: 34
ferzmikk,

ничего не знаю про промежуточные этапы, я просто анализировал данные - начальные и конечные.
В этом запросе Вы получили ещё кучу строк, например все строки ТТ2 Список2, которые как-то надо потом отсеивать.
Обычный full join, создаёт 13 нужных строк (если не обращать внимание на то, что пока они в разных столбцах), две из которых просто надо сложить по вполне понятному условию, чтобы получить требуемый результат. Логика вполне ясна. Единственное, что из логики вылетает, это вторая строка в треб. результате: ТТ1 Список1 SKU2 В списке -
Не будь её совсем, код написать не сложно. Объясните логику её появления в соответствии с Вашим "условием соединения таблиц" или разберитесь с бредовостью результата, т.к. скорее всего это ещё одна опечатка.
27 май 16, 12:13    [19227380]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
ferzmikk
Member

Откуда:
Сообщений: 2260
Lavrov_Yura
ferzmikk,

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

Для простоты понимания получения таблиц разделяю на шаги. Типа, сначала в первую таблицу вставляем колонку "SKU_Объед", потом выгружаем предыдущий список (ТТ - Привязанный_cписок - SKU_не_объед - SKU_Объед). Потом сравниваем эти таблицы, делаем разность. Возможно это идея для решения задачи не совсем удачная.
Lavrov_Yura
В этом запросе Вы получили ещё кучу строк, например все строки ТТ2 Список2, которые как-то надо потом отсеивать.
Обычный full join, создаёт 13 нужных строк (если не обращать внимание на то, что пока они в разных столбцах), две из которых просто надо сложить по вполне понятному условию, чтобы получить требуемый результат. Логика вполне ясна. Единственное, что из логики вылетает, это вторая строка в треб. результате: ТТ1 Список1 SKU2 В списке -
Не будь её совсем, код написать не сложно. Объясните логику её появления в соответствии с Вашим "условием соединения таблиц" или разберитесь с бредовостью результата, т.к. скорее всего это ещё одна опечатка.

Актуально показать, что SKU2 в ТТ1 не было отгрузок, но надо отгрузить. Чтобы было видно где еще не отгружено по обязательным SKU. Также актуально показать, что SKU "в списке" или "не в списке".

Насколько я правильно понимаю решение задачи усложняется из за этих строк
Выборка результат
Код_ТТ Привязанный _списокSKUСтатус_SKUОтгрузки
ТТ1Список1SKU2В списке
ТТ2Список1SKU3 + SKU4В списке
ТТ3Список2SKU5В списке
ТТ3Список2SKU6В списке
27 май 16, 12:58    [19227610]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
Lavrov_Yura
Member

Откуда:
Сообщений: 34
ferzmikk,

Вот код, задачка вообще интересная, столбец статуса добавь сам
--первое и третье условие соединения таблиц
select t1.Код_ТТ, t1.Привязанный_cписок,isnull(t2.SKU_объед, t1.SKU_не_объед) as sku, sum(t1.Отгрузки) as Отгрузки  
from t1 
left join t2 on t1.Привязанный_cписок=t2.Номер_списка
and t1.SKU_не_объед = t2.SKU_не_объед
group by  t1.Код_ТТ, t1.Привязанный_cписок, isnull(t2.SKU_объед, t1.SKU_не_объед)
union
--второе условие соединения таблиц - есть в списке (в табл2), но не отгружено (нет в табл1), по какому принципу им даётся Код_ТТ - хрен его разберёт
select t1.Код_ТТ, t2.Номер_списка, t2.SKU_Объед, t1.Отгрузки  from t1 
right join t2 on t1.Привязанный_cписок =t2.Номер_списка
and t1.SKU_не_объед = t2.SKU_не_объед
where Код_ТТ is null --любой столбец не null из табл. t1, обычно использую конструкцию where not in по id, но тут двойной ключ.
--второй строки из треб. результата здесь не будет, ибо SKU2 было отгружено с кодом ТТ2 в кол-ве 22, как она там появляется так я и не понял
27 май 16, 17:00    [19229166]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
Lavrov_Yura
Member

Откуда:
Сообщений: 34
ferzmikk,

логика условий соединения таблиц реализована полностью, за бредовость треб. результата (в плане неизвестных условий добавления Код_ТТ к неотгруженным и опять-таки вторая строчка) я не отвечаю, это уже к преподу, составившему задачу.
Удачи.
27 май 16, 17:08    [19229189]     Ответить | Цитировать Сообщить модератору
 Re: Соединение таблиц с условиями  [new]
ferzmikk
Member

Откуда:
Сообщений: 2260
Получилось по требованиям код написать)
29 май 16, 10:19    [19232251]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить