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

Czy można zrobić coś takiego?Jak uzyskać wartość x bez duplikacji kodu?

 

    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) odpowiedź może zależeć od dostawcy SQL. MySQL? Wyrocznia? Serwer SQL? 2) Założę się na tabelę tymczasową zawierającą pierwsze dwie kolumny, a następnie wybierz z niej dwie kolumny i nową kolumnę. Może to zrobić – Patashu

Odpowiedz

5

Nie można używać ALIAS który został podany na tym samym poziomie klauzuli SELECT.

Masz dwie możliwości:

  • za pomocą wyrażenia bezpośrednio

zapytania:

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 
  • owijając w podkwerendzie

zapytanie:

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! podzapytanie jest tym, czego szukałem. – user2328819

0

Nie możesz tego zrobić niestety.

ALIAS nie może być używany na tym samym poziomie, na którym je utworzyłeś.

Stół tymczasowy jest niezbędny, jak sądzę.

1

Również w SQLServer2005 + można użyć 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 
Powiązane problemy