5
    创建表 t(a int, b int);
    插入 t 值 (1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2 ),(3,3);

    从 t 中选择 *;

    一个   |   b
    ----------
    1 | 1
    1 | 2
    1 | 3
    2 | 1
    2 | 2
    2 | 3
    3 | 1
    3 | 2
    3 | 3

    选择
      最大值(当 a = 1 然后 b 否则 0 结束时的情况)作为 q,
      最大值(当 b = 1 然后 a else 0 结束的情况)为 c,
      (
        最大值(a = 1 然后 b 否则 0 结束的情况)
        +
        最大值(当 b = 1 然后 a else 0 结束时的情况)
      ) 作为 x
    从T

有可能做这样的事情吗?

    选择
      最大值(当 a = 1 然后 b 否则 0 结束时的情况)作为 q,
      最大值(当 b = 1 然后 a else 0 结束的情况)为 c,
      ( q + c ) 作为 x
    从T

4

3 回答 3

5

您不能使用在子句ALIAS的同一级别上给出的那个。SELECT

你有两个选择:

  • 通过直接使用表达式

询问:

select
  max(case when a = 1 then b else 0 end) as q,
  max(case when b = 1 then a else 0 end) as c,
  (max(case when a = 1 then b else 0 end) + max(case when b = 1 then a else 0 end)) as x
from t
  • 通过包装在子查询中

询问:

SELECT  q, 
        c,
        q + c as x
FROM
(
  select
      max(case when a = 1 then b else 0 end) as q,
      max(case when b = 1 then a else 0 end) as c
    from t
) d
于 2013-05-01T08:52:35.310 回答
1

同样在 SQLServer2005+ 中,您可以使用 CTE

;WITH cte AS
 (
  select max(case when a = 1 then b else 0 end) as q,
         max(case when b = 1 then a else 0 end) as c
  from t
  )
  SELECT q, c, q + c as x
  FROM cte
于 2013-05-01T10:03:09.763 回答
0

不幸的是,你不能这样做。

ALIAS 不能在您创建它们的同一级别中使用。

我认为需要一个临时表。

于 2013-05-01T08:59:16.863 回答