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

Откуда:
Сообщений: 416
Добрый день.

читал(msdn.microsoft.com), что нельзя образовать селект, который бы образовывал результирующий набор и записывал значение в переменную одновременно. Но как быть в след ситуации:

получаю дату с помощью громоздких вычислений (datetime = MAX(.... ..... ....) - datetime1 и т.д.) а теперь эту дату нужно распарсить на составляющие дней, часов и записать каждую часть в свой столбец (для дальнейших вычислений) Неужели нет способа чтобы временно в теле селекта сохранить эту дату в виде переменной и тут-же от неё использовать функции работы с датами (year, Month и т.д.)

Неужели прийдется писать нечто вроде:

Year( SUM(datediff(mi, datetime2, datetime1) ) as 'Год'
Month( SUM(datediff(mi, datetime2, datetime1) ) as 'месяц'
Days( SUM(datediff(mi, datetime2, datetime1) ) as 'День'


Нет способа покрасивее ? =) заранее благодарю.
9 апр 12, 16:31    [12388817]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Exproment, может так
+

declare @t table ( dt datetime )
insert  into @t
        ( dt )
values  ( '20120409' )
,       ( '20120410' ) ;
with  zz ( mdt )
        as ( select max(dt)
             from   @t
           )
  select  year(mdt)
        , month(mdt)
        , day(mdt)
  from    zz

9 апр 12, 16:36    [12388848]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Exproment
Member

Откуда:
Сообщений: 416
Обобщенные табличные выражения конечно выход. Не спорю... Получается конкретно в теле запроса указать переменную и в этом-же запросе её использовать нельзя ?
9 апр 12, 16:39    [12388891]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
Обобщенные табличные выражения конечно выход. Не спорю... Получается конкретно в теле запроса указать переменную и в этом-же запросе её использовать нельзя ?


select mycolumn 
from (select <получаю дату с помощью громоздких вычислений (datetime = MAX(.... ..... ....) - datetime1 и т.д.)> as mycolumn ...
) as x
9 апр 12, 16:47    [12388966]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Exproment
Member

Откуда:
Сообщений: 416
Спасибо огромное. Видимо без CTE или под запросов все равно не обойтись. Благодарю за ответы.
9 апр 12, 16:53    [12389022]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Exproment
Спасибо огромное. Видимо без CTE или под запросов все равно не обойтись. Благодарю за ответы.


9 апр 12, 18:16    [12389648]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Exproment
Member

Откуда:
Сообщений: 416
юмор ?
9 апр 12, 19:22    [12389948]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Exproment
Member

Откуда:
Сообщений: 416
Хорошо, если нельзя реализовать временную переменную внутри селекта, то как тогда красиво преобразовать количество минут (Взятых из datediff) в формат:

"Дней д, Часов ч. Минут м."

напр:

"4 д. 5 ч. 23 м."

Ради такой задачи чтобы не повторять вычисления 3 вложенных запроса формировать ??? или может вот так :

cast(cte.SumTime/1440 as varchar) + ' д. ' +
cast((cte.SumTime - 1440*(cte.SumTime/1440))/60 as varchar) + ' ч. ' +
cast(cte.SumTime - (1440*(cte.SumTime/1440) + ((cte.SumTime - 1440*(cte.SumTime/1440))/60)*60) as varchar) + ' м.',

3 раза считая одно и тоже?
11 апр 12, 10:03    [12397283]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
3 раза считая одно и тоже?

Можно вообще не считать ни разу. Пускай клиентское приложение это делает
11 апр 12, 10:11    [12397328]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Exproment
Ради такой задачи чтобы не повторять вычисления 3 вложенных запроса формировать ???
Что вы так вложенных запросов боитесь???
Это просто выражение в скобках; в подавляющем большинстве языков программирования даже так нельзя сделать, нужно полностью повторять выражение много раз, и в отличие от сиквела оно будет много раз считаться.
11 апр 12, 10:21    [12397380]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Exproment
Ради такой задачи чтобы не повторять вычисления
Корректнее написать "чтобы не набирать один текст 3 раза", вычисления то повторяться не будут.
11 апр 12, 10:22    [12397386]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Exproment
Member

Откуда:
Сообщений: 416
Glory, а нужно выполнять на стороне сервера. Не хочу обьяснять архитектуру. Но есть именно такая необходимость. Причем довольно частое явление.

alexeyvg, слава богу я с такими языками программирования не сталкивался =) Как так, что вычисления повторятся не будут ? Неужели SQL настолько гениален, что поймет что "cte.SumTime/1440" можно посчитать один раз и вставить в остальные выражения ? Конечно я понимаю, что SQL лишь описывает логику, но как-то странно это звучит =)
11 апр 12, 10:47    [12397538]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Exproment
Member

Откуда:
Сообщений: 416
А насчет вложенных запросов: хорошо, если нужно просто провести данные вычисления, а когда у тебя есть запрос в 90 строк, то делать его дважды вложенным... Как минимум будет смотрется не совсем очевидно.
11 апр 12, 10:48    [12397554]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
Glory, а нужно выполнять на стороне сервера.

Ну так выполняйте. В чем проблема то ?

Exproment
Неужели SQL настолько гениален, что поймет что "cte.SumTime/1440" можно посчитать один раз и вставить в остальные выражения ? Конечно я понимаю, что SQL лишь описывает логику, но как-то странно это звучит =)

Вы это опять по информации в правом нижнем углу окна запуска получаете ?
11 апр 12, 10:57    [12397622]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Exproment
А насчет вложенных запросов: хорошо, если нужно просто провести данные вычисления, а когда у тебя есть запрос в 90 строк, то делать его дважды вложенным... Как минимум будет смотрется не совсем очевидно.
Почему, как раз 90 строк будет в глубине, уровнями выше запрос будет проще. То есть только в самом внутреннем запросе останутся джойны, условия, вычисляемые колонки, в наверху будет только перечисление полей и остатки вычислений из уже вычесленных полей.
Exproment
Как так, что вычисления повторятся не будут ? Неужели SQL настолько гениален, что поймет что "cte.SumTime/1440" можно посчитать один раз и вставить в остальные выражения ? Конечно я понимаю, что SQL лишь описывает логику, но как-то странно это звучит =)
Ну, не совсем везде, но иногда повторять не будет, например, если выражение используется как выводимая колонка и в условии.

К тому же время тратится на выборку данных, экономии на вычислениях всё равно не получится.

Кстати, конкретно для cte.SumTime/1440 скорее всего даже для вложенных запросов сервер раскроет вложнность и повторит вычисления несколько раз :-) Вы можете это проверить в профайлере.
11 апр 12, 11:10    [12397732]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Exproment
Member

Откуда:
Сообщений: 416
Glory
Вы это опять по информации в правом нижнем углу окна запуска получаете ?

Какую информацию ? вопрос ? 0_о )

alexeyvg
Почему, как раз 90 строк будет в глубине, уровнями выше запрос будет проще. То есть только в самом внутреннем запросе останутся джойны, условия, вычисляемые колонки, в наверху будет только перечисление полей и остатки вычислений из уже вычесленных полей.

Так эти асбтарктные 90 полей прийдется передавать от запроса к запросу, т.к. * тут не обойтись. напр:
Select Стлбец1,
         Стлбец2,
         Стлбец3,
         Стлбец4,
         Преобразование(Время В минутах) as Часы
from   (Select Стлбец1,
               Стлбец2,
               Стлбец3,
               Стлбец4,
               Время  AS Минуты
          From  Таблица)
 

Ну нехорошо выглядит.

alexeyvg
Ну, не совсем везде, но иногда повторять не будет, например, если выражение используется как выводимая колонка и в условии.

Я вас понял. Спасибо что разъяснили. Теперь буду знать =)
11 апр 12, 13:40    [12399141]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
Какую информацию ? вопрос ? 0_о )

О "Неужели SQL настолько гениален, что поймет что "cte.SumTime/1440" можно посчитать один раз и вставить в остальные выражения "
11 апр 12, 13:53    [12399271]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Exproment
Member

Откуда:
Сообщений: 416
Glory, вы упустили знак вопроса в конце =) я спрашивал =)
11 апр 12, 13:56    [12399299]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Glory
Member

Откуда:
Сообщений: 104751
Exproment
Glory, вы упустили знак вопроса в конце =) я спрашивал =)

Ну так вот и спрашивал - откуда вы берете информацию о том, что, как и сколько раз делает сервер при том или ином запросе.
11 апр 12, 14:00    [12399338]     Ответить | Цитировать Сообщить модератору
 Re: Переменные в селекте. Нубский вопрос.  [new]
Exproment
Member

Откуда:
Сообщений: 416
В том-то и дело, что не понимаю, потому и спросил =) В общем не суть, не поняли видать друг друга =)
11 апр 12, 14:29    [12399632]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить