powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как ссылаться в запросе на вычисляемые поля ?
10 сообщений из 10, страница 1 из 1
как ссылаться в запросе на вычисляемые поля ?
    #32012910
DennisL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли в запросе ссылаться на вычисляемые поля ? если да то как ? (интересует для MS SQL 7 и 2000)

пример : SELECT a.Agr_id, a.Dep, (SELECT SUM(Price) FROM Cars WHERE Agr_id=a.Agr_id) AS CarSum
a.Summ*a.Rate as ConvSum ....

WHERE CarSum<=@MaxSum
and ConvSum>=@MaxSum

ORDER BY a.Dep
COMPUTE SUM(CarSum), SUM(ConvSum) BY a.Dep

таким образом ничего не получаеться : invalid column name !

если ссылатся на вычисляемые столбцы нельзя, то как рашаються данные задачи ?
остаеться использовать только временные таблицы ?
...
Рейтинг: 0 / 0
как ссылаться в запросе на вычисляемые поля ?
    #32012914
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT Dep, CarSum, ConvSum FROM
(SELECT a.Agr_id, a.Dep, (SELECT SUM(Price) FROM Cars WHERE Agr_id=a.Agr_id) AS CarSum,
a.Summ*a.Rate as ConvSum ....
WHERE CarSum<=@MaxSum
and ConvSum>=@MaxSum
) AS tmp1
ORDER BY Dep
COMPUTE SUM(CarSum), SUM(ConvSum) BY Dep
...
Рейтинг: 0 / 0
как ссылаться в запросе на вычисляемые поля ?
    #32012915
Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Остается только вставлять формулу в предложение where:

select a.Price*a.Qnt as Sum
from tAccount a
where a.Price*a.Qnt > 1000
...
Рейтинг: 0 / 0
как ссылаться в запросе на вычисляемые поля ?
    #32012916
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то на вычисляемые поля ссылаться можно, но это нечто другое.
Я на Вашем месте делал бы как-то так(COMPUTE никогда не использовал, так что может так и не подойдет Вам):
SELECT a.Agr_id, a.Dep, SUM(a.Price) AS CarSum, SUM(c.Price*a.Rate) as ConvSum ....

from ... a , Cars c
WHERE CarSum<=@MaxSum
and ConvSum>=@MaxSum
...
and c.Agr_id=a.Agr_id

group by a.Agr_id, a.Dep
...
Рейтинг: 0 / 0
как ссылаться в запросе на вычисляемые поля ?
    #32012920
DennisL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
glory :
1. SELECT Dep, CarSum, ConvSum FROM здесь не пропущенно поле Agr_id ? или так и надо ?
мне надо получить список с уникальными Agr_id и для каждой группы у которых одинаковый dep сумму !

2.запрос данного вида будет работать быстрее чем временные таблицы ?
в данный момент у меня сделано так что, мой запрос работает со временной таблицей которая заполняеться с помощью еще одного запроса где тоже производиться дополнительное суммирование и т.д. (используя пердложенную конструкцию подзапросов его тоже можно было бы засунуть внутрь ...)

Дмитрий:
А если ставить в условие опять выражение то оно будет вычисляться еще раз ?? или будет использованнно уже вычисленное значение ?
проблема в том что я написал упрощенный примерчик, а реально в вычислениях у меня используються разультаты подзапросов которые выполняються не так быстро ...


sergSuper:
а у вас нет ошибки при попытке сделать :
WHERE CarSum<=@MaxSum
and ConvSum>=@MaxSum ?

мне не удаеться например использовать вычисленные поля в WHERE !
...
Рейтинг: 0 / 0
как ссылаться в запросе на вычисляемые поля ?
    #32012926
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2SergSuper
----------
Такую возможность, выражения с алиасами полей,
встречал только в MS Access. SQL Server увы...
...
Рейтинг: 0 / 0
как ссылаться в запросе на вычисляемые поля ?
    #32012930
Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, как показывает план выполнения, значения будут считаться два раза: в Where, а потом в Select. Но другого способа обращения к вычисляемым полям, скорее всего, нет, поскольку они не существуют на момент проверки условий.
...
Рейтинг: 0 / 0
как ссылаться в запросе на вычисляемые поля ?
    #32012931
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SELECT a.Agr_id, a.Dep, (SELECT SUM(Price) FROM Cars WHERE Agr_id=a.Agr_id) AS CarSum
>a.Summ*a.Rate as ConvSum ....
>WHERE CarSum<=@MaxSum
>and ConvSum>=@MaxSum
>ORDER BY a.Dep
>COMPUTE SUM(CarSum), SUM(ConvSum) BY a.Dep

Так как нет полного запроса, то только ориентировочно...

SELECT a.Agr_id, a.Dep, MIN(a.Summ*a.Rate) as ConvSum, SUM(c.Price) AS CarSum,
FROM a inner join Cars c ON (c.Agr_id=a.Agr_id) AS CarSum
GROUP BY a.Agr_id, a.Dep
HAVING SUM(c.Price)<=@MaxSum AND MIN(a.Summ*a.Rate) >=@MaxSum
ORDER BY a.Dep
COMPUTE SUM(SUM(c.Price)), SUM(MIN(a.Summ*a.Rate)) BY a.Dep

Хотя, если честно, то смотрится ужасно...
...
Рейтинг: 0 / 0
как ссылаться в запросе на вычисляемые поля ?
    #32012932
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. >здесь не пропущенно поле Agr_id ? или так и надо ?

Тут уж вам решать (у меня же нет ваших таблиц
), я просто показал вам, как можно использовать в качестве источника для SELECT-а другой SELECT .
Т.е.

SELECT * FROM
(SELECT myfield1, (SELECT SUM(myfield2) FROM mytable2 WHERE ...)
FROM mytable
WHERE ...
) AS tmp1
LEFT OUTER JOIN
(SELECT myfield1, (SELECT SUM(myfield2) FROM mytable3 WHERE ...)
FROM mytable4
WHERE ...
) AS tmp2 ON tmp2.myfield1 = tmp1.myfield1
...


Для SQL2000 можно также использовать функции, которые возвращают таблицу.

2.>запрос данного вида будет работать быстрее чем временные таблицы ?

Скорость выполнение запроса зависит еще от многих условий, например, наличия индексов и статистики. Трудно что-то советовать, не зная ничего о таблицах и задаче, которую нужно решить. В общем случае , конечно, нужно избегать временных таблиц, но в конкретном - временные таблицы, view-ы, индексы или просто промежуточные таблицы с уже рассчитаными заранее итогами(например, для a.Agr_id, a.Dep) за период/на дату - кто знает, что лучше всего скажется на произодительности (а может быть вообще увеличение ресурсов сервера)

Точный ответ вам даст аудит выполнения, просмотр execution plan-а и настройка индексов.
...
Рейтинг: 0 / 0
как ссылаться в запросе на вычисляемые поля ?
    #32012933
Фотография ChA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм... А у Glory почти верно
>SELECT a.Agr_id, a.Dep, (SELECT SUM(Price) FROM Cars WHERE Agr_id=a.Agr_id) AS CarSum
>a.Summ*a.Rate as ConvSum ....
>WHERE CarSum<=@MaxSum
>and ConvSum>=@MaxSum
>ORDER BY a.Dep
>COMPUTE SUM(CarSum), SUM(ConvSum) BY a.Dep

Приблизительно так:
SELECT a.Agr_id, a.Dep, a.Summ*a.Rate as ConvSum, c.CarSum
FROM a INNER JOIN (SELECT Agr_id, SUM(Price) AS CarSum FROM Cars GROUP BY Agr_id) AS c ON (c.Agr_id=a.Agr_id)
WHERE c.CarSum<=@MaxSum
and a.Summ*a.Rate>=@MaxSum
ORDER BY a.Dep
COMPUTE SUM(c.CarSum), SUM(a.Summ*a.Rate) BY a.Dep
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как ссылаться в запросе на вычисляемые поля ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]