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

Откуда:
Сообщений: 2031
Здравствуйте!
+ Есть список уникальных ТТ+SKU и для каждого свои периоды
ТТSKUStartDateEndDate
ТТ1SKU1 01.10.201710.10.2017
ТТ1SKU2 01.10.201710.10.2017
ТТ2SKU1 08.10.201716.10.2017
ТТ2SKU2 08.10.201716.10.2017
............

Для каждого ТТ+SKU имеет свое количество сценарий, в зависимости от длины периода. То есть в одном сценарии должно быть 7 дней. К примеру

Для ТТ1+SKU1, где StartDate = 01.10.2017 и EndDate=10.10.2017 должно быть 4 периода по 7 дней подряд:
1. 01.10.2017 - 07.10.2017
2. 02.10.2017 - 08.10.2017
3. 03.10.2017 - 09.10.2017
4. 04.10.2017 - 10.10.2017

А для ТТ2+SKU1, где StartDate = 08.10.2017 и EndDate=12.10.2017 должно быть 3 периода по 7 дней подряд:
1. 08.10.2017 - 14.10.2017
2. 09.10.2017 - 15.10.2017
3. 10.10.2017 - 16.10.2017

+ Нужен такой результат
СценарийTTSKUStartDateВСценарииEndDateВСценарииДата
Сценарий1ТТ1SKU101.10.201707.10.201701.10.2017
Сценарий1ТТ1SKU101.10.201707.10.201702.10.2017
Сценарий1ТТ1SKU101.10.201707.10.201703.10.2017
Сценарий1ТТ1SKU101.10.201707.10.201704.10.2017
Сценарий1ТТ1SKU101.10.201707.10.201705.10.2017
Сценарий1ТТ1SKU101.10.201707.10.201706.10.2017
Сценарий1ТТ1SKU101.10.201707.10.201707.10.2017
Сценарий2ТТ1SKU102.10.201708.10.201702.10.2017
Сценарий2ТТ1SKU102.10.201708.10.201703.10.2017
Сценарий2ТТ1SKU102.10.201708.10.201704.10.2017
Сценарий2ТТ1SKU102.10.201708.10.201705.10.2017
Сценарий2ТТ1SKU102.10.201708.10.201706.10.2017
Сценарий2ТТ1SKU102.10.201708.10.201707.10.2017
Сценарий2ТТ1SKU102.10.201708.10.201708.10.2017
..................

+ Пытаюсь написать SQL-запрос для данной задачи
DECLARE @TT_SKU Table
( CodeTT varchar (8), SKU int, DateStart date, DateEnd date) 

INSERT INTO @TT_SKU SELECT 'ТТ1', 00001,'01.10.2017', '10.10.2017'
INSERT INTO @TT_SKU SELECT 'ТТ1', 00002,'01.10.2017', '10.10.2017'
INSERT INTO @TT_SKU SELECT 'ТТ2', 00001,'08.10.2017', '16.10.2017'
INSERT INTO @TT_SKU SELECT 'ТТ2', 00002,'08.10.2017', '16.10.2017'

SELECT
	CodeTT,
	SKU,
	DateStart,
	DateEnd,
	DateDiff(day,DateStart,dateEnd)+1 AS КоличествоДнейВПериоде	
FROM
	@TT_SKU 
Запутался. Тут похоже цикл нужен. Скажите для решения данной задачи какую функцию надо использовать? Как правильно написать запрос?
25 дек 17, 15:31    [21060795]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
общая идея (@td - может быть заранее заполнена):
set dateformat dmy

declare @td table (d date)
declare @d datetime = '2017-01-01'

while @d <= '2018-01-10'
begin
insert @td (d) select @d
set @d = dateadd(dd,1,@d)
end

-------------------------------------------------------------------------

declare @tt_sku table
( codett varchar (8), sku int, datestart date, dateend date) 

insert into @tt_sku select 'tt1', 00001,'01.10.2017', '10.10.2017'
insert into @tt_sku select 'tt1', 00002,'01.10.2017', '10.10.2017'
insert into @tt_sku select 'tt2', 00001,'08.10.2017', '16.10.2017'
insert into @tt_sku select 'tt2', 00002,'08.10.2017', '16.10.2017'

select
*
from
@tt_sku t
outer apply
(select d as istart, dateadd(dd,6,td.d) as iend from @td td where td.d >= datestart and dateadd(dd,6,td.d) <= dateend) f
25 дек 17, 16:48    [21061086]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по запросу  [new]
мегамозг
Member

Откуда: Екатеринбург
Сообщений: 71
ferzmikk
... Запутался. Тут похоже цикл нужен. Скажите для решения данной задачи какую функцию надо использовать? Как правильно написать запрос?

Если даты начала и конца в пределах 2 недель, то сделать еще одну табличку x с числами от 1 до 7 и сджойнить ее с таблицей, а потом это сджойнить с таблицей по условию t0.DateStart + x.num +7 меньше t1.DateEnd. Естественно для конкретной пары значений ТТ+SKU.
25 дек 17, 16:58    [21061122]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить