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

Откуда:
Сообщений: 2083
Здравствуйте! Ест примерно такая таблица
idxSummaDataPlanDataFact
101000.000001.12.2012NULL
203000.000001.12.201201.12.2012
304000.000003.12.201204.12.2012
405000.000005.12.2012NULL

Также есть входящий параметр IsFact, в зависимости от которого, выбираются строки с плановыми/фактическими датами.
Если IsFact = 0, то берем DataPlan и строки, у которых DataFact = null. Если IsFact = 1, то на DataPlan внимания не обращаем и берем диапазон дат только по DataFact
Решение вроде-бы несложное, вот скрипт
set dateformat dmy

declare @t table (idx int identity(10,10), Summa decimal(19,4), DataPlan datetime, DataFact datetime)
insert @t
  select 1000,'01.12.2012', null union all select 3000,'01.12.2012','01.12.2012' union all select 4000,'03.12.2012','04.12.2012' union all select 5000,'05.12.2012',null
select idx, Summa, convert(char(10),DataPlan,104) [DataPlan], convert(char(10),DataFact,104) [DataFact] from @t

declare @DataBegin datetime, @DataEnd datetime, @IsFact tinyint
select @DataBegin = '30.11.2012', @DataEnd = '05.12.2012', @IsFact = 0

if @IsFact = 0
  select idx, Summa, DataPlan [Data]
  from @t
  where (DataPlan >= @DataBegin) and (DataPlan < @DataEnd + 1) and (DataFact is null)
else
  select idx, Summa, DataFact [Data]
  from @t
  where (DataFact >= @DataBegin) and (DataFact < @DataEnd + 1)

Можно ли обойтись без конструкции IF...ELSE как-нибудь одним запросом через хитрый where ?
17 янв 13, 15:48    [13786089]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате. Хитрая логика.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
user89
Можно ли обойтись без конструкции IF...ELSE как-нибудь одним запросом через хитрый where ?

Можно,
  select idx, Summa, DataPlan [Data]
  from @t
  where (@IsFact = 0 and (DataPlan >= @DataBegin) and (DataPlan < @DataEnd + 1) and (DataFact is null))
        or
        (@IsFact = 1 and (DataFact >= @DataBegin) and (DataFact < @DataEnd + 1))
, только проверьте получившийся план выполнения.
17 янв 13, 15:55    [13786143]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате. Хитрая логика.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
То есть вот так, конечно (не обратил внимания, что даты в селекте из разных столбцов берутся):
  select idx, Summa, isnull(DataFact, DataPlan) [Data]
  from @t
  where (@IsFact = 0 and (DataPlan >= @DataBegin) and (DataPlan < @DataEnd + 1) and (DataFact is null))
        or
        (@IsFact = 1 and (DataFact >= @DataBegin) and (DataFact < @DataEnd + 1))
17 янв 13, 16:00    [13786188]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате. Хитрая логика.  [new]
user89
Member

Откуда:
Сообщений: 2083
Гость333,

спасибо! Работает.
А план выполнения здесь не очень важен, т.к. выборка идет по временной таблице #tmp, число записей не превысит 500.

З.Ы. Ваше решение действительно простое, а я строил небоскребы из case, nullif, isnull ...
17 янв 13, 16:04    [13786216]     Ответить | Цитировать Сообщить модератору
 Re: Запрос по дате. Хитрая логика.  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость333
user89
Можно ли обойтись без конструкции IF...ELSE как-нибудь одним запросом через хитрый where ?

Можно,
  select idx, Summa, isnull(DataFact, DataPlan) [Data]
  from @t
  where (@IsFact = 0 and (DataPlan >= @DataBegin) and (DataPlan < @DataEnd + 1) and (DataFact is null))
        or
        (@IsFact = 1 and (DataFact >= @DataBegin) and (DataFact < @DataEnd + 1))
, только проверьте получившийся план выполнения...
... и замените на UNION ALL
17 янв 13, 16:06    [13786232]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить