выбор значения, которое является вычитанием двух сводных - PullRequest
1 голос
/ 23 октября 2011

У меня есть этот запрос, который работает ...

select 
    t.date, 
    sum(gk.d) as d, 
    sum(gk.p) as p,
    (sum(d)-sum(p)) as s

Но мне интересно, есть ли способ выбрать значение 's' как dp, примерно так:

select 
    t.date, 
    sum(gk.d) as d, 
    sum(gk.p) as p,
    (d-p) as s // not working

Ответы [ 3 ]

4 голосов
/ 23 октября 2011

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 требует от вас определения псевдонима таблицы для производных таблиц / встроенных представлений - отсюда и «AS x»

3 голосов
/ 23 октября 2011

Взгляните на SELECT doc , раздел «Порядок логической обработки оператора 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
2 голосов
/ 23 октября 2011

Вы также можете использовать общее табличное выражение в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...