2013-05-01 12 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 

È possibile fare qualcosa del genere?come ottenere il valore x senza duplicazione del codice

 

    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) La risposta può variare in base al fornitore di SQL. MySQL? Oracolo? Server SQL? 2) Scommetto che una tabella temporanea contenente le prime due colonne, quindi una selezione da essa per selezionare le due colonne più la nuova colonna, potrebbe farlo – Patashu

risposta

5

Non è possibile utilizzare la ALIAS che è stato dato allo stesso livello della clausola SELECT.

si hanno due scelte:

  • utilizzando l'espressione direttamente

query:

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 
  • avvolgendo in una sottoquery

query:

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! la subquery è ciò che stavo cercando. – user2328819

0

Non si può fare che purtroppo.

L'ALIAS non può essere utilizzato nello stesso livello in cui sono stati creati.

Un tavolo temporaneo è necessario, penso.

1

Anche in SQLServer2005 + è possibile utilizzare 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 
Problemi correlati