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

Откуда:
Сообщений: 7825
Имеется таблица с данными
CREATE TABLE [dbo].[T_NEDR_DATA_PERIOD] (
  [N_ID_NEDR] int NOT NULL, /* идент. недр */
  [D_DATE] datetime NOT NULL, /* Значения месячные, т.е. 01.MM.YYYY */
  [N_ID_POK] int NOT NULL, /* идент. показателя */
  [F_VALUE] float NOT NULL,
  CONSTRAINT [T_NEDR_DATA_PERIOD_PK] PRIMARY KEY CLUSTERED ([D_DATE], [N_ID_POK], [N_ID_NEDR])
)
Как выбрать данные одним запросом за последние 6 месяцев для заданного года (пусть 2007) при фиксированных: [N_ID_NEDR] = 4010; [N_ID_POK]=15; Скрипт тестирующих данных прилагается.

К сообщению приложен файл (T_NEDR_DATA_PERIOD.sql - 8Kb) cкачать
23 июн 09, 08:14    [7331245]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
А в чем затруднения? Написать вычисление диапазона дат для заданного года?
23 июн 09, 08:22    [7331256]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
iljy
Guest
Владимир СА,

declare @SDate datetime, @EData datetime
set @EData = dateadd(year, @Year + 1, 0)
set @SData = dateadd(month, -6, @EData)
select * from T_NEDR_DATA_PERIOD
where D_DATE between @SData and @EData
   and [N_ID_NEDR] = 4010 and [N_ID_POK]=15
23 июн 09, 08:24    [7331259]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
Владимир СА
Member

Откуда:
Сообщений: 7825
iljy
Владимир СА,

declare @SDate datetime, @EData datetime
set @EData = dateadd(year, @Year + 1, 0)
set @SData = dateadd(month, -6, @EData)
select * from T_NEDR_DATA_PERIOD
where D_DATE between @SData and @EData
   and [N_ID_NEDR] = 4010 and [N_ID_POK]=15

Информации по некоторым месяцам может и не быть...
Например: данные имеются за январь, март, апрель, сентябрь, окрябрь, ноябрь, декабрь.
Здесь 7 месяцев, а надо 6. т.е. данные должны быть за март, апрель, сентябрь, окрябрь, ноябрь, декабрь.
23 июн 09, 08:28    [7331261]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
Владимир СА
Member

Откуда:
Сообщений: 7825
Извиняюсь, заказчик только что поменял постановку задачи. Последние непрерывные 6 месяцев. Остутствующие месяцы заполнять нулями. Сейчас сам покумекаю и если что обращусь.
23 июн 09, 08:33    [7331269]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Владимир СА
iljy
Владимир СА,

declare @SDate datetime, @EData datetime
set @EData = dateadd(year, @Year + 1, 0)
set @SData = dateadd(month, -6, @EData)
select * from T_NEDR_DATA_PERIOD
where D_DATE between @SData and @EData
   and [N_ID_NEDR] = 4010 and [N_ID_POK]=15

Информации по некоторым месяцам может и не быть...
Например: данные имеются за январь, март, апрель, сентябрь, окрябрь, ноябрь, декабрь.
Здесь 7 месяцев, а надо 6. т.е. данные должны быть за март, апрель, сентябрь, окрябрь, ноябрь, декабрь.

select top 6
 *
from T_NEDR_DATA_PERIOD
where  D_DATE <= '2007'
order by D_DATE desc


Сообщение было отредактировано: 23 июн 09, 08:37
23 июн 09, 08:33    [7331270]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну и (забыл блин...) добавить условия по остальным столбцам.
А как быть, если в году в условия отбора попадут только 1, 2 или... меньше 6 строк? Если только за указанныйгод, то в условие добавить и ограничение снизу.

Сообщение было отредактировано: 23 июн 09, 08:35
23 июн 09, 08:35    [7331272]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
tpg
select top 6
 *
from T_NEDR_DATA_PERIOD
where  D_DATE <= '2007'
order by D_DATE desc
А почему "<= '2007'"?
IMHO, надо
select top 6
 *
from T_NEDR_DATA_PERIOD
where  D_DATE < '2008'
order by D_DATE desc
23 июн 09, 08:44    [7331290]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
iap
А почему "<= '2007'"?
А с чего вы взяли, что я делаю выборку за 2007, а не за 2006 год?
Я приницип показывал! ;-)
23 июн 09, 08:48    [7331302]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
tpg
iap
А почему "<= '2007'"?
А с чего вы взяли, что я делаю выборку за 2007, а не за 2006 год?
Я приницип показывал! ;-)
Если это был выбор за 2006 год, то в него попало '20070101 00:00:00.000'
23 июн 09, 08:56    [7331316]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Рука дрогнула...
23 июн 09, 08:59    [7331320]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
Владимир СА
Member

Откуда:
Сообщений: 7825
По моему если мы вибираем за 2007 то <= '2007'
23 июн 09, 09:06    [7331336]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Владимир СА
По моему если мы вибираем за 2007 то <= '2007'
Обоснуйте.
23 июн 09, 09:15    [7331355]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Владимир СА
По моему если мы вибираем за 2007 то <= '2007'
'2007' == '20070101'
23 июн 09, 09:17    [7331359]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
Владимир СА
Member

Откуда:
Сообщений: 7825
Вроде как заказчик сказал, что если данные есть за последний месяц пусть март 2007, то от него отсчитываем назад 6 месяцев. Т.е. период теперь будет:
октябрь, ноябрь, декабрь 2006; январь, февраль, март 2007.
Теперь на этом остановились.
23 июн 09, 09:20    [7331368]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
Владимир СА
Member

Откуда:
Сообщений: 7825
tpg
Владимир СА
По моему если мы вибираем за 2007 то <= '2007'
'2007' == '20070101'
Конечно
23 июн 09, 09:20    [7331369]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Владимир СА
tpg
Владимир СА
По моему если мы вибираем за 2007 то <= '2007'
'2007' == '20070101'
Конечно
Что "конечно"? Если хотите за 2007, то пишите, как iap показал.
23 июн 09, 09:23    [7331378]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
tpg
Владимир СА
По моему если мы вибираем за 2007 то <= '2007'
'2007' == '20070101'
Точнее
http://msdn.microsoft.com/ru-ru/library/ms187085.aspx
23 июн 09, 09:24    [7331381]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
Владимир СА
Member

Откуда:
Сообщений: 7825
tpg
Владимир СА
tpg
Владимир СА
По моему если мы вибираем за 2007 то <= '2007'
'2007' == '20070101'
Конечно
Что "конечно"? Если хотите за 2007, то пишите, как iap показал.
если данные есть за последний месяц пусть март 2007, то от него отсчитываем назад 6 месяцев. Т.е. период теперь будет:
октябрь, ноябрь, декабрь 2006; январь, февраль, март 2007.
23 июн 09, 09:25    [7331389]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Владимир СА
Вроде как заказчик сказал, что если данные есть за последний месяц пусть март 2007, то от него отсчитываем назад 6 месяцев. Т.е. период теперь будет:
октябрь, ноябрь, декабрь 2006; январь, февраль, март 2007.
Теперь на этом остановились.
    D_DATE>=DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-5,0)
AND D_DATE< DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())+1,0)
23 июн 09, 09:34    [7331412]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
Владимир СА
Member

Откуда:
Сообщений: 7825
iap
Владимир СА
Вроде как заказчик сказал, что если данные есть за последний месяц пусть март 2007, то от него отсчитываем назад 6 месяцев. Т.е. период теперь будет:
октябрь, ноябрь, декабрь 2006; январь, февраль, март 2007.
Теперь на этом остановились.
D_DATE>=DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-5,0)
AND D_DATE< DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())+1,0)
Да, спасибо.

Маленькая задачка начинает обрастаться. Ну это как всегда водится.
23 июн 09, 09:43    [7331448]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Владимир СА
iap
Владимир СА
Вроде как заказчик сказал, что если данные есть за последний месяц пусть март 2007, то от него отсчитываем назад 6 месяцев. Т.е. период теперь будет:
октябрь, ноябрь, декабрь 2006; январь, февраль, март 2007.
Теперь на этом остановились.
D_DATE>=DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())-5,0)
AND D_DATE< DATEADD(MONTH, DATEDIFF(MONTH,0, GETDATE())+1,0)
Да, спасибо.

Маленькая задачка начинает обрастаться. Ну это как всегда водится.
Но если у Вас есть "последний месяц" в виде 'YYYYMM01', то всё проще:
DECLARE @M VARCHAR(8);
SET @M='20090301';
SELECT *
FROM T_NEDR_DATA_PERIOD
WHERE D_DATE>=DATEADD(MONTH,-5,@M) AND D_DATE<DATEADD(MONTH,1,@M)
AND [N_ID_NEDR]=4010 AND [N_ID_POK]=15;
23 июн 09, 09:51    [7331474]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать данные за последние 6 месяцев  [new]
Владимир СА
Member

Откуда:
Сообщений: 7825
iap
Но если у Вас есть "последний месяц" в виде 'YYYYMM01', то всё проще:
DECLARE @M VARCHAR(8);
SET @M='20090301';
SELECT *
FROM T_NEDR_DATA_PERIOD
WHERE D_DATE>=DATEADD(MONTH,-5,@M) AND D_DATE<DATEADD(MONTH,1,@M)
AND [N_ID_NEDR]=4010 AND [N_ID_POK]=15;
Спасибо. Этим и воспользовался.
23 июн 09, 13:23    [7332793]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить