Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ломаю голову 3ий день / 20 сообщений из 20, страница 1 из 1
25.07.2018, 13:27
    #39678887
framework
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Нужно отобрать данные с промежутком дат -1 неделя от этих дат но чтобы они не совпадали т.е.

Date between DATEADD (week, -1, Begin) and DATEADD (week, -1, End)

получаем что эти даты совпадают
2017-12-25 2017-12-31
2017-12-18 2017-12-24

Как написать это условие?

BEGIN END
2018-01-01 2018-01-07
2017-12-25 2017-12-31
2017-12-18 2017-12-24
2017-04-10 2017-04-16
2017-03-06 2017-03-12
...
Рейтинг: 0 / 0
25.07.2018, 14:26
    #39678936
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
frameworkэти даты совпадают
2017-12-25 2017-12-31
2017-12-18 2017-12-24чёта не очень они совпадают... попробуйте объяснить задачу как-то по-иному, ни хрена ж не понять.
...
Рейтинг: 0 / 0
25.07.2018, 14:33
    #39678941
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Akinaframeworkэти даты совпадают
2017-12-25 2017-12-31
2017-12-18 2017-12-24чёта не очень они совпадают... попробуйте объяснить задачу как-то по-иному, ни хрена ж не понять.

Ну, у страдальца дата попадает в ДВА интервала.
Вот он и не могет решить: "какой взять?"

Тут, без волюнтаризма, никуда.
...
Рейтинг: 0 / 0
25.07.2018, 14:34
    #39678942
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Наверное "не пересекались"
...
Рейтинг: 0 / 0
25.07.2018, 15:29
    #39679011
framework
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Datex between DATEADD (week, -1, PromotionGoodsTimeBegin) and DATEADD (week, -1, PromotionGoodsTimeEnd)

Это условие возвращает следующие даты:

2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24
2017-12-11 _____ 2017-12-17
2017-04-03 _____ 2017-04-09
2017-02-28 _____ 2017-03-04

Т.е. первые строки совпадают с датами из табл.(см. скрин)
2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24

А надо чтобы вместо этих дат были ближайшие прошлые даты, а именно:
2017-12-04 ______ 2017-12-10
2017-11-29 ______ 2017-12-03
...
Рейтинг: 0 / 0
25.07.2018, 15:38
    #39679021
framework
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Подскажите, как написать запрос, который бы сравнивал данные за последний период таким образом, чтобы эти даты не пересекались из табл(см. скрин) и период был одинаковый?

Например этим условием я сравниваю данные за прошлую неделю, и даты пересекаются с таблицей(см. скрин):

Datex between DATEADD (week, -1, PromotionGoodsTimeBegin) and DATEADD (week, -1, PromotionGoodsTimeEnd)

Это условие возвращает следующие даты:

2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24
2017-12-11 _____ 2017-12-17
2017-04-03 _____ 2017-04-09
2017-02-28 _____ 2017-03-04

Т.е. первые строки совпадают с датами из табл.(см. скрин)
2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24

А надо чтобы вместо этих дат были ближайшие прошлые даты, а именно:
2017-12-04 ______ 2017-12-10
2017-11-29 ______ 2017-12-03
...
Рейтинг: 0 / 0
25.07.2018, 15:39
    #39679022
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Точно, узнаю, вы профессиональные писцы тех. заданий
...
Рейтинг: 0 / 0
25.07.2018, 15:40
    #39679027
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
framework,

2017-12-04 ______ 2017-12-10
2017-11-29 ______ 2017-12-03

это вы откуда взяли? И почему это? Покажите репрезентативный набор данных, а не остатки грелки после Тузика.
...
Рейтинг: 0 / 0
25.07.2018, 15:44
    #39679030
framework
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Владислав Колосов, это предыдущие дни календаря, т.е. я хочу получить данные за этот период вместо дат, которые повторяются
2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24
...
Рейтинг: 0 / 0
25.07.2018, 16:22
    #39679092
ломаю голову 3ий день
framework,

для имеющейся выборки временных отрезков (Пн-Вс), найти отрезки той же длины, которые не соприкасаются с имеющимися отрезками (т.е. отстоящими от имеющихся на 1 неделю, слева и справа)?
...
Рейтинг: 0 / 0
25.07.2018, 16:24
    #39679095
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
framework,

наверное же какой date такой и dateadd(week, -1).
...
Рейтинг: 0 / 0
25.07.2018, 16:26
    #39679098
framework
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Собиратель мифов,
Вы правильно поняли.
...
Рейтинг: 0 / 0
25.07.2018, 17:23
    #39679162
ломаю голову 3ий день
framework,

Сформировать выборку со всеми отрезками.
Исключить (EXCEPT) имеющиеся отрезки.
Исключить отрезки, предшествующие имеющимся.
Исключить отрезки, следующие за имеющимися.
...
Рейтинг: 0 / 0
25.07.2018, 17:49
    #39679188
framework
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Собиратель мифов,
при использовании (EXCEPT) нужно исключать, указывая сами отрезки дат, поэтому такой вариант не подходит. Необходимо, чтобы данный скрипт был применим для всех продуктов, у которых эти отрезки дат будут разными. Я думаю в сторону применения условия
типа CASE, IIF

Вот сам скрипт, в Cteprod необходимо это условие

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
With
Cteprom
as
(
select p.GoodsId, pw.WarehouseId, p.PromotionGoodsTimeBegin, p.PromotionGoodsTimeEnd
from PromotionGoods p with(NoLock) join PromotionGroup pg with(NoLock) on p.PromotionGroupId=pg.PromotionGroupId
join PromotionWarehouse pw with(NoLock) on pw.PromotionGroupId=p.PromotionGroupId
where p.GoodsId in (7815)
and pw.WarehouseId in (999)
),

CteprodAMD
as
(
select g.GoodsId, g.GoodsName, c.WarehouseId, SUM(c.Quantity) QuaCredit			
from Goods g with(NoLock), CreditView c with(NoLock) , Cteprom
where g.Goodsid=c.Goodsid
and Cteprom.GoodsId=c.GoodsId
and Cteprom.WarehouseId=c.WarehouseId
and c.Datex between Cteprom.PromotionGoodsTimeBegin and Cteprom.PromotionGoodsTimeEnd
group by g.GoodsId, g.GoodsName, c.WarehouseId
),

Cteprod
as
(
select g.GoodsId, g.GoodsName, c.WarehouseId, SUM(c.Quantity) QuaCredit, c.Datex			
from Goods g with(NoLock), CreditView c with(NoLock), Cteprom
where g.Goodsid=c.Goodsid
and Cteprom.GoodsId=c.GoodsId
and Cteprom.WarehouseId=c.WarehouseId
and c.Datex between DATEADD (week, -1, Cteprom.PromotionGoodsTimeBegin) and DATEADD (week, -1, Cteprom.PromotionGoodsTimeEnd)
group by g.GoodsId, g.GoodsName, c.WarehouseId, c.Datex
)

select *
from CteprodAMD join Cteprod on CteprodAMD.GoodsId=Cteprod.GoodsId
join Cteprom on Cteprod.GoodsId=Cteprom.GoodsId
...
Рейтинг: 0 / 0
26.07.2018, 13:59
    #39679626
framework
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
Я пытался создать это условие в case, но сервер не понимает then and
Код: sql
1.
2.
3.
4.
5.
case 
when
Cteprod.Datex between Cteprom.PromotionGoodsTimeBegin and Cteprom.PromotionGoodsTimeEnd then DATEADD (week, -1, Cteprom.PromotionGoodsTimeBegin) 
and DATEADD (week, -1, Cteprom.PromotionGoodsTimeEnd) 
end
...
Рейтинг: 0 / 0
26.07.2018, 14:04
    #39679629
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
frameworkЯ пытался создать это условие в case, но сервер не понимает then and
Код: sql
1.
2.
3.
4.
5.
case 
when
Cteprod.Datex between Cteprom.PromotionGoodsTimeBegin and Cteprom.PromotionGoodsTimeEnd then DATEADD (week, -1, Cteprom.PromotionGoodsTimeBegin) 
and DATEADD (week, -1, Cteprom.PromotionGoodsTimeEnd) 
end

А что там делает AND ??
По-вашему, 25 AND 15 на SQL-сервере чему равно?
...
Рейтинг: 0 / 0
26.07.2018, 14:06
    #39679630
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
framework,

замечу, что полей или переменных типа BOOLEAN в T-SQL не бывает.
Как и явного типа BOOLEAN
...
Рейтинг: 0 / 0
26.07.2018, 14:11
    #39679633
framework
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
iap, равно >15 and <25
Но как это условие в сервере?
...
Рейтинг: 0 / 0
26.07.2018, 14:15
    #39679635
framework
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
я же в начале с помощью
Код: sql
1.
between

указываю промежуток, можно ли применить
Код: sql
1.
between

после
Код: sql
1.
then

или с помощью какого оператора это сделать на сервере ?
...
Рейтинг: 0 / 0
27.07.2018, 13:51
    #39680208
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ломаю голову 3ий день
framework,

CASE - это скалярная функция. Возвращает ровно одно значение.
Все логические условия должны быть написаны в WHEN.
В THEN должен быть возвращаемый результат определённого типа.
WHEN и THEN в одном CASE может быть много. Справку не читали?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ломаю голову 3ий день / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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