выбор значения, которое является вычитанием двух сводок

#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).