powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL запрос к таблицам многие-ко-многим с ограничениями
11 сообщений из 11, страница 1 из 1
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099271
llama3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обращаюсь за помощью с формированием SQL запроса.
Суть следующая:

Есть 2 таблицы
Таблица 1 - Задачи:
Data - дата создания задачи, Org - id организации, idT - id задачи(уникальное)
Org1, Data, IdT1
Org1, Data, IdT2
Org1, Data, IdT3
Org1, Data, IdT4
Org2, Data, idT5

Таблица 2 – Сделки:

Data - дата создания сделки, Org - id организации, idD- id сделки(уникальное), Status - статус
Org1, Data, Status1, idD1
Org1, Data, Status2, idD2
Org2, Data, Status1, idD3

Для каждой организации выбрать задачи и сделки, при этом разница между датой создания задачи и сделки не более 5 дней. К одной задаче могут подходить от 0 до нескольких сделок, но сделка не может подходить к нескольким задачам. Разница между датой задачи и сделки должна быть минимальна, но сделка всегда позже задачи.
На выходе что-то похожее на:

Org1, Data, IdT1, idD1, Data
Org1, Data, IdT1, null, null
Org1, Data, IdT2, null, null
Org1, Data, IdT3, null, null
Org1, Data, IdT4, idD2, Data
Org2, Data, idT5, null, null

Перебрала разные варианты, но выйти на корректное решение так и не удалось. Скорее всего иду не по тому пути.
Наиболее близким был запрос, но он не отражает несколько записей для одной задачи, а берет только минимум:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT   задачи.Org, задачи.data, задачи.idT,t2.data_сделки, t2.idd
FROM задачи LEFT JOIN 
(SELECT  t1.Org,t1.data_задачи,t1.idT, t1.data_сделки, сделки.idd
FROM
(SELECT задачи.Org, задачи.data AS data_задачи, задачи.idT, MIN(Сделки.data)  AS data_сделки
FROM задачи, Сделки
WHERE задачи.Org=сделки.Org AND
 Сделки.data>[задачи].[DATA]  AND Сделки.data-[задачи].[DATA]<5
GROUP BY задачи.Org, задачи.data , задачи.idT) t1 INNER JOIN сделки ON t1.Org=сделки.Org AND t1.data_сделки=сделки.data ) t2
ON задачи.idT=t2.idT AND задачи.data=t2.data_задачи
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099296
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llama3,

если сделки не связаны с задачами, то есть совершаются без ссылки на задачу, то вы можете только предположительно связывать сделку и задачу, а это недопустимо. Вам надо реорганизовать процесс обработки сделок, связать с задачами.
Иначе пересечения множеств сделок и задач будут догадкой.
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099327
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llama3,
Следует использовать такую конструкцию

Код: sql
1.
2.
3.
4.
5.
6.
7.
OUTER APPLY 
(
SELECT TOP 1
... здесь выберите то, что удовлетворяет критерию 
Дата <= 
ORDER BY Дата 
)
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099345
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чему в школах учат?
Код: sql
1.
2.
3.
SELECT   задачи.Org, задачи.data, задачи.idT,t2.data_сделки, t2.idd
FROM задачи as t
    LEFT JOIN Сделки as x on ON t.idT = x.idT AND x.data_сделки = ( select min(y.data_сделки) from Сделки as y where t.idT = y.idT and y.data_сделки >= t.data )
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099518
llama3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,

согласна, результат может быть некорректным из-за неверной структуры, но задание было именно таким..
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099519
llama3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

запрос не выдаст верные результаты. это будет минимальная дата, а тут закладывается логика, что их может быть несколько в разные дни для одной задачи.
Сделала в итоге так, думаю, что тоже неоптимально, но результат вроде как выдается корректный.
Пошла по такой логике:
1. Выбираем сделки, которые были совершены на следующий день после даты задания
2. Выбираем сделки, которые были совершены спустя 2 дня после внесения задания, при этом из выборки сделок исключаем те, которые уже учтены в п.1
3. Проделываем операции, аналогичные п.2 для данных до того момента, пока разница между датами не превышает 5 дней
4. Объединяем результаты, полученные в п.1-3 и данные из таблицы по заданиям, сделки для которых не были найдены

select задачи.Org, задачи.data, задачи.idT, d.IDd, d.data_сделки
from задачи left join
(SELECT задачи.*, Сделки.IDd, Сделки.data as data_сделки
FROM задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org
where Сделки.data- задачи.data=1
union
SELECT задачи.*, Сделки.IDd, Сделки.data as data_сделки
FROM задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org
where Сделки.data- задачи.data=2 and Сделки.IDd not in (select сделки.IDd from задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org
where Сделки.data- задачи.data=1)
union
SELECT задачи.*, Сделки.IDd, Сделки.data as data_сделки
FROM задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org
where Сделки.data- задачи.data=3 and Сделки.IDd not in (select сделки.IDd from задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org
where Сделки.data- задачи.data between 0 and 3)
union
SELECT задачи.*, Сделки.IDd, Сделки.data as data_сделки
FROM задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org
where Сделки.data- задачи.data=4 and Сделки.IDd not in (select сделки.IDd from задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org
where Сделки.data- задачи.data between 0 and 4)
union
SELECT задачи.*, Сделки.IDd, Сделки.data as data_сделки
FROM задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org
where Сделки.data- задачи.data=5 and Сделки.IDd not in (select сделки.IDd from задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org
where Сделки.data- задачи.data between 0 and 5)
) as d
on задачи.idt=d.idt and задачи.data=d.data
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099523
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llama3
aleks222,

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

Учитесь внятно формулировать. И будет вам щастье.

Осподе, какой ужос то....
И из-за этого вы нам тут выносили мозг?

Код: sql
1.
2.
SELECT задачи.*, Сделки.IDd, Сделки.data as data_сделки
FROM задачи INNER JOIN Сделки ON задачи.idt = Сделки.idt and задачи.Org = Сделки.Org and Сделки.data  between dateadd( day, 1, задачи.data) and dateadd( day, 5, задачи.data )



зря вы пошли программировать.
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099683
llama3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

Формулировка не моя.

Я учусь программировать, вроде форум тут, в том числе, и для этих целей. Ваш запрос не выдает даты с минимальным интервалом, он покажет результаты с заданным диапазоном дат, а надо вывести результат, где одна сделка соответствует одной задаче и одной сделке может соответствовать несколько задач, при этом разница между датами минимальна (+ менее 5 дней) и дата сделки позже даты задачи.
Если бы все было так просто, я бы не спрашивала.
Для наглядности прикладываю скрин.
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099694
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llama3,
а почему у Вас сделка 147 привязана и к 464 и 456 заданию, а сделка 146 только к 464 и не привязана к 455
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099937
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot
llama3,
а почему у Вас сделка 147 привязана и к 464 и 456 заданию, а сделка 146 только к 464 и не привязана к 455


Вопрос в пустоту.
Тредстартерша не в состоянии ни осмыслить, ни сформулировать желаемое.
...
Рейтинг: 0 / 0
SQL запрос к таблицам многие-ко-многим с ограничениями
    #40099940
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SELECT *
FROM задачи INNER JOIN Сделки ON задачи.Org = Сделки.Org 
                                and Сделки.data  between dateadd( day, 1, задачи.data) and dateadd( day, 5, задачи.data )
                                and Сделки.data  < ( select min(data) from задачи as t where t.Org = задачи.Org and t.data > задачи.data )
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SQL запрос к таблицам многие-ко-многим с ограничениями
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]