2013-05-01 17 views
5
 

    create table t(a int, b int); 
    insert into t values (1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3); 

    select * from t; 

    a | b 
    ---------- 
    1 | 1 
    1 | 2 
    1 | 3 
    2 | 1 
    2 | 2 
    2 | 3 
    3 | 1 
    3 | 2 
    3 | 3 

    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 

是否有可能做這樣的事情?如何獲得價值x沒有代碼重複

 

    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, 
     (q + c) as x 
    from t 

+1

1)答案可能會因您的SQL供應商。 MySQL的?甲骨文? SQL Server? 2)我下注了一個臨時表,它包含前兩列,然後從中選擇兩列加上新列,可以做到 – Patashu 2013-05-01 08:51:11

回答

5

不能使用已在SELECT條款同級別給出的ALIAS

你有兩個選擇:

  • 通過使用表達式直接

查詢:

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 
+0

TNX 100x!子查詢就是我一直在尋找的東西。 – user2328819 2013-05-01 09:58:53

0

不幸的是你不能這樣做。

ALIAS不能用於創建它們的相同級別。

我認爲臨時表是必要的。

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