2014-12-19 2 views
2

Я хотел бы преобразовать этот пример MS Access динамического запроса в T-SQL:Преобразование MS Access динамического столбца в SQL Server

SELECT 
    Name, 
    iif(expression='A', value, 0) as vA, 
    iif(expression='B', value, 0) as vB, 
    vA-vB as diff 
FROM 
    MyTable 

Я попробовал этот код, но компилятор бросить меня, что новые динамические столбцы vA и vB в выражении vA-vB as diff не распознаются.

SELECT 
    Name, 
    CASE WHEN expression = 'A' then value else 0 end AS vA, 
    CASE WHEN expression = 'B' then value else 0 end AS vB, 
    vA-vB as diff 
FROM 
    MyTable 
+2

определяются ваши псевдонимы, когда строка завершает обработку. поэтому они недоступны в контексте «чтения» в другом месте в той же строке. –

ответ

3

Вы не можете использовать псевдоним, который определен в одном и том же предложении выбора. Попробуй это.

SELECT NAME, 
     CASE WHEN expression = 'A' THEN value ELSE 0 END    AS vA, 
     CASE WHEN expression = 'B' THEN value ELSE 0 END    AS vB, 
     (CASE WHEN expression = 'A' THEN value ELSE 0 END) - 
     (CASE WHEN expression = 'B' THEN value ELSE 0 END) AS diff 
FROM MyTable 

или сделать запрос в качестве Sub select и найти diff в outer query

SELECT vA, 
     VB, 
     vA - vB AS Diff 
FROM (SELECT NAME, 
       CASE WHEN expression = 'A' THEN value ELSE 0 END AS vA, 
       CASE WHEN expression = 'B' THEN value ELSE 0 END AS vB 
     FROM MyTable) A 
+0

Это одна из многих особенностей Access, что вы можете использовать псевдонимы в предложении SELECT, хотя, насколько я помню, они должны быть определены последовательно. Это может быть полезно, но это может быть полный кошмар, если в запросе с таким же именем, как поле таблицы, есть вычисленное поле. – citizenkong

Смежные вопросы