powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с выполнением запроса
12 сообщений из 12, страница 1 из 1
Помогите с выполнением запроса
    #39980131
maay123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте друзья,запрос звучит так:
Найти покупателей (имя, фамилия), у которых не было промежутков между заказами, превышающих полгода.
Выполнил запрос я как то так да и в интернете чужие запросы тоже самые данные мне выводило:
Код: sql
1.
2.
3.
4.
select distinct c.ContactName from Customers c
inner join Orders o on o.CustomerID=c.CustomerID
where  not exists (select * from Orders where OrderDate>DATEADD(MONTH,6,o.OrderDate))
order by c.ContactName



НО такой запрос выводит вторую половину

Код: sql
1.
2.
3.
4.
select distinct c.ContactName from Customers c
inner join Orders o on o.CustomerID=c.CustomerID
where  exists (select * from Orders where OrderDate>DATEADD(MONTH,6,o.OrderDate))
order by c.ContactName



когда я вывел данные между датами я вижу такую картину что например:
Запрос из первого выводит мне Павла(если тут у меня 2 даты) и второй выводит мне Павла только с датами который соответсвует запросу но (с 4 датами) ''Наверное не что не понятно что я написал''
Задача такова что
Найти покупателей (имя, фамилия), у которых не было промежутков между заказами , превышающих полгода.
если есть промежуток то он не должен вывести мне этого покупателя
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980328
daniel klein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй так

select distinct c.ContactName from Customers c
left join Orders o on o.CustomerID=c.CustomerID and exists (select * from Orders where OrderDate>DATEADD(MONTH,6,o.OrderDate))
where o.CustomerID is null
order by c.ContactName
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980334
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
daniel klein,

Как эта часть запроса позволит вам найти Покупателей (CustomerID), у которых не было промежутков между заказами, превышающих полгода? Здесь же идет выборка ВСЕХ дат заказов Всех Покупателей
Код: sql
1.
(select * from Orders where OrderDate>DATEADD(MONTH,6,o.OrderDate))
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980345
daniel klein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вернее так

select c.ContactName from Customers c
left join Orders o on o.CustomerID=c.CustomerID and exists (select * from Orders where OrderDate>DATEADD(MONTH,6,o.OrderDate))
group by c.ContactName
having count(o.CustomerID)=0
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980459
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maay123,
как-то так

Код: sql
1.
2.
3.
4.
5.
6.
7.
; with tr as (
select distinct o.Customerid from Orders o
cross apply (select top 1 t.OrderDate from Orders t where t.CustomerID=o.CustomerId and t.OrderDate>o.OrderDate  order by t.OrderDate) as ot
where DATEDIFF(MM, o.OrderDate,ot.OrderDate) >6
)
select c.CompanyName from Customers c
where  not exists(select tr.CustomerId from tr where c.CustomerID=tr.CustomerID )
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980464
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так чуть лучше
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
; with tr as (
select distinct o.Customerid from Orders o
cross apply (select  min(t.OrderDate) as OrderDate from Orders t where t.CustomerID=o.CustomerId and t.OrderDate>o.OrderDate -- order by t.OrderDate
) as ot
where DATEDIFF(MM, o.OrderDate,ot.OrderDate) >6
)
select c.CompanyName from Customers c
where  not exists(select tr.CustomerId from tr where c.CustomerID=tr.CustomerID )
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980499
maay123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,daniel klein,
Огромное спасибо за то что отреагировали.
С уважением Владимир!
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980712
maay123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql
так чуть лучше
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
; with tr as (
select distinct o.Customerid from Orders o
cross apply (select  min(t.OrderDate) as OrderDate from Orders t where t.CustomerID=o.CustomerId and t.OrderDate>o.OrderDate -- order by t.OrderDate
) as ot
where DATEDIFF(MM, o.OrderDate,ot.OrderDate) >6
)
select c.CompanyName from Customers c
where  not exists(select tr.CustomerId from tr where c.CustomerID=tr.CustomerID )



А как это все написать тоже самое только без CROSS APPLY возможно ли это ? старался у меня чет не получилось
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980727
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select * from Customers c where
  6 > all(
    select datediff(month, d1, d2)
      from (
        select o1.CustomerID, o1.OrderDate d1, MIN(o2.OrderDate) d2
          from [dbo].[Orders] o1 join [dbo].[Orders] o2
            on o1.CustomerID = o2.CustomerID
          where o2.OrderDate > o1.OrderDate
          group by o1.CustomerID, o1.OrderDate
      ) t
      where t.CustomerID = c.CustomerID
  )
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980729
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maay123
А как это все написать тоже самое только без CROSS APPLY возможно ли это ? старался у меня чет не получилось

Добавь в таблицу заказов поле "Время, прошедшее после последнего заказа"
в котором по текущему заказу проставлялось бы обработкой или "при работе" данное значение.
далее элементарно.
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980854
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,

Код: sql
1.
 6 > all(


чуть не так
надо
Код: sql
1.
 7 > all(


или
Код: sql
1.
 6 >= all(
...
Рейтинг: 0 / 0
Помогите с выполнением запроса
    #39980909
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
godsql
fkthat,

Код: sql
1.
 6 > all(


чуть не так
надо
Код: sql
1.
 7 > all(


или
Код: sql
1.
 6 >= all(



Да, но это уже тонкости, основная идея, я думаю, понятно. К тому же еще и не совсем даже понятно, что считать "промежутком певышающем полгода" - то ли по разнице месяцев в 6, то ли по разнице дней в 365/2.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с выполнением запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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