选择一个减去两个摘要的值

时间:2011-10-23 17:35:50

标签: sql sql-server tsql sql-server-2008

我有这个查询有效......

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

但我想知道有没有办法选择价值''作为d-p,就像这样:

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

3 个答案:

答案 0 :(得分:4)

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”

答案 1 :(得分:3)

查看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 :(得分:2)

您还可以在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