#sql #sql-server #tsql #sql-server-2008
#sql #sql-сервер #tsql #sql-server-2008
Вопрос:
У меня есть этот запрос, который работает…
select
t.date,
sum(gk.d) as d,
sum(gk.p) as p,
(sum(d)-sum(p)) as s
Но мне интересно, есть ли способ выбрать значение ‘s’ как d-p, что-то вроде этого:
select
t.date,
sum(gk.d) as d,
sum(gk.p) as p,
(d-p) as s // not working
Ответ №1:
SQL в целом не поддерживает ссылки на псевдонимы столбцов в том же предложении SELECT, поэтому первая версия работает для вас, а вторая — нет. Альтернативой является использование производной таблицы / встроенного представления:
SELECT x.date,
x.d,
x.p,
x.d - x.p AS s
FROM (SELECT t.date,
SUM(gk.d) AS d,
SUM(gk.p) AS p,
FROM t
JOIN gk ON ...) AS x
Имейте в виду, что SQL Server требует, чтобы вы определяли псевдоним таблицы для производных таблиц / встроенных представлений — отсюда и «КАК x»
Ответ №2:
Взгляните на документ SELECT, раздел «Логический порядок обработки оператора SELECT»; в них есть объяснение, почему и где вы можете ссылаться на столбцы по псевдонимам. Обычным обходным путем является использование производных таблиц или CTE.
Так что это должно сработать для вас:
SELECT d, p , d-p AS s
FROM
(
select
t.date,
sum(gk.d) as d,
sum(gk.p) as p
FROM ....
)a
Ответ №3:
Вы также можете использовать общее табличное выражение в SQL 2008:
WITH sumCTE AS
(
SELECT t.date
, SUM(gk.d) as d
, SUM(gk.p) as p
FROM ...
)
SELECT d, p, d - p AS s
FROM sumCTE
Комментарии:
1.
WITH
Синтаксис — это синтаксический сахар для производной таблицы / встроенного представления. В этом примере нет никакого преимущества в производительности, и он равен 2005 (помимо ограниченной поддержки в других местах — MySQL еще не поддерживает предложение WITH).