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

Откуда:
Сообщений: 12
Возможно ли сделать так:

select
  45 As [p1], 
  12 As [p2], 
   [p1]*[p1] As [p3],
.......
sum( case when	t = 7 then 1 end) As [p7],
[p7]/[p3] As [p8]
........


Т.е. что так не работает я уже вижу, потому что ошибку выдает на умножении. Но можно ли как нибудь сделать, чтобы обращаться к полю по имени после AS.

Для чего понадобился такой запрос из констант? Там дальше будут запросы к базе на определение количества и сумм, а потом между ними и константами надо строить разные соотношения, и все это вывести в отчет. Хотелось бы реализовать это через одну функцию, которая бы возвращала набор данных из одной строки таблицы, и потом просто расставить эти данные по полям отчета.

Можно конечно было использовать подстановку напрямую. Но проблема в том, что параметры выборки и константы будет еще не один раз меняться, и каждый раз придется править все формулы, где они фигурируют.

Можно ли как-то реализовать обращение к полям по именам через табличную функцию? Пусть даже она будет немножко громоздкой, лишь бы по именам полей )
31 май 16, 21:15    [19243088]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать заголовок столбца в запросе?  [new]
Pavel1211
Member

Откуда: Екатеринбург
Сообщений: 205
scorpy
Но можно ли как нибудь сделать, чтобы обращаться к полю по имени после AS.


можно через CTE
31 май 16, 21:24    [19243139]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать заголовок столбца в запросе?  [new]
пьяный тюлень
Member

Откуда:
Сообщений: 100
select
  45 As [p1], 
  12 As [p2], 
  [p3],
.......
  [p7],
  [p8]
........
cross apply(values([p1]*[p1],sum( case when t = 7 then 1 end))) a([p3],[p7])
cross apply(values([p7]/[p3])) b([p8])
1 июн 16, 11:33    [19244708]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать заголовок столбца в запросе?  [new]
scorpy
Member

Откуда:
Сообщений: 12
Спасибо. С cross apply выглядит конечно заманчиво, надо будет эту тему переварить.

Пока сделал с СТЕ, даже все заработало, поместив в With все входящие извне данные, их по крайней мере можно будет легко подправить, если что-то изменится. Получилось так:

WITH ste (np1, np2, prost, fakt, nezal,zalfakt)
AS
	(
	select 
	45.00 As [np1]
	, datediff ("s",@d1, @d2)/3600.00 As [np2]
	, (sum( case when t > 240  AND [oper] = 14 then t-80 end ))/3600.00 As [prost]
	, sum( case when [oper] = 33 AND t<>0 then 1 end ) As [fakt]
	, sum( case when [prz1] = 6 AND t<>0 then 1 else 0 end ) As [nezal]
	, sum( case when [oper] = 36 AND t<>0 then 1 end ) As [zalfakt]
	from dbo.View_1
        Where (datetime between @d1 AND @d2)
	)
   SELECT 
//................

from ste


Упростило жизнь это ненамного, и во второй части запроса получилась настоящая каша из арифметики, где эти данные комбинируются друг с другом, ссылаются друг на друга и снова комбинируются. Но это все происходит хотя бы "внутри" без запросов в БД. Но вроде все заработала и показывает правильно), хотя на такой код больно смотреть, сплошная копипаста одних кусков запроса в другие
1 июн 16, 22:58    [19247922]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать заголовок столбца в запросе?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
scorpy
Упростило жизнь это ненамного, и во второй части запроса получилась настоящая каша из арифметики, где эти данные комбинируются друг с другом, ссылаются друг на друга и снова комбинируются
Ну, всё таки есть же какие то "уровни" использования промежуточных результатов?

При правильном форматировании текста, это выглядит вполне нормально даже с использованием вложенных запросов/CTE

PS Не забывайте, что CTE тоже может быть вложенным.
2 июн 16, 14:12    [19250181]     Ответить | Цитировать Сообщить модератору
 Re: Как использовать заголовок столбца в запросе?  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
У меня как то было 7 уровней вложенности CTE, и ничего - взлетело. Главное не забывать везде алиасы писать, а то потом фиг разберешься в этом.
2 июн 16, 22:22    [19252312]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить