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

Откуда:
Сообщений: 573
Подскажите как написать select распределения по дням.
Есть select a.поле1, а.поле2 from table1
в поле1 30 дней длительность цикла в поле2 01.12.2010 дата начала. Нужно создать таблицу 30 строк по числу дней и заполнить поле этой таблицы датами по нарастанию начиная с 01.12.2010
8 ноя 11, 09:40    [11561555]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
МИхаил__________________
Member

Откуда:
Сообщений: 573
select t.поле1, t.поле2 from t

поле1 поле2
---------- ----------
31 01.12.2010

нужно получить таблицу

поле1 поле2
_____ ______
1 01.12.2010
2 02.12.2010
3 03.12.2010
4 04.12.2010
-
-
-
31 31.12.2010
8 ноя 11, 09:49    [11561598]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=316343&hl=
8 ноя 11, 09:51    [11561604]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
МИхаил__________________,

сами-то Вы как пытались? Покажите - поправим!
8 ноя 11, 09:51    [11561605]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
МИхаил__________________
Member

Откуда:
Сообщений: 573
задача решается так
DECLARE @Cardinality INT, @Seed DATETIME, @Increment INT;
SELECT @Cardinality = 31, @Seed = '2010-01-12', @Increment = 1;
WITH T(ID,N) AS
(
SELECT 1, @Seed WHERE @Cardinality >= 1
UNION ALL
SELECT ID + 1, N + @Increment FROM T WHERE ID < @Cardinality
)
SELECT ID, N FROM T ORDER BY ID
OPTION (MAXRECURSION 0);

только непонятно, как в цикле выбрать записи из таблицы для их записи в @Cardinality = 31, @Seed = '2010-01-12', @Increment = 1;
8 ноя 11, 10:07    [11561707]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
МИхаил__________________
Member

Откуда:
Сообщений: 573
iap
МИхаил__________________,

сами-то Вы как пытались? Покажите - поправим!

подскажите как исправить, чтобы работало в цикле по исходной таблице
8 ноя 11, 10:14    [11561754]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
МИхаил__________________,

SELECT DATEADD(DAY,а.поле2,v.number)
FROM table1 JOIN master.dbo.spt_values v ON v.type='P' AND v.number<a.поле1
ORDER BY v.number;
Вместо master.dbo.spt_values лучше применять свою постоянную таблицу с последовательными числами.
8 ноя 11, 10:14    [11561757]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
МИхаил__________________
iap
МИхаил__________________,

сами-то Вы как пытались? Покажите - поправим!

подскажите как исправить, чтобы работало в цикле по исходной таблице
Что Вы заладили "в цикле, в цикле"?
Забудьте пока слово "цикл".
8 ноя 11, 10:15    [11561766]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
МИхаил__________________
Member

Откуда:
Сообщений: 573
SELECT DATEADD(DAY, CAST([Дата начала Факт] AS DATE),v.number)
FROM [ресурсы] JOIN master.dbo.spt_values v ON v.type='P' AND v.number<[Длительность в днях Факт]
ORDER BY v.number;
Сообщение 8116, уровень 16, состояние 1, строка 1
Тип данных аргумента date недопустим для аргумента 2 функции dateadd.
какой тип нужен во втором аргументе?
8 ноя 11, 10:36    [11561925]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
МИхаил__________________
SELECT DATEADD(DAY, CAST([Дата начала Факт] AS DATE),v.number)
FROM [ресурсы] JOIN master.dbo.spt_values v ON v.type='P' AND v.number<[Длительность в днях Факт]
ORDER BY v.number;
Сообщение 8116, уровень 16, состояние 1, строка 1
Тип данных аргумента date недопустим для аргумента 2 функции dateadd.
какой тип нужен во втором аргументе?
Перепутал аргументы:
SELECT DATEADD(DAY,v.number, CAST([Дата начала Факт] AS DATE))
FROM [ресурсы] JOIN master.dbo.spt_values v ON v.type='P' AND v.number<[Длительность в днях Факт]
ORDER BY v.number;
8 ноя 11, 10:51    [11562018]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите как написать select распределения по дням.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
МИхаил__________________,

алиасы лучше всегда использовать
8 ноя 11, 10:52    [11562024]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить