Tsql 在SQL Server中转换MS Access动态列

Tsql 在SQL Server中转换MS Access动态列,tsql,ms-access,Tsql,Ms Access,我想将此MS Access动态查询示例转换为T-SQL: SELECT Name, iif(expression='A', value, 0) as vA, iif(expression='B', value, 0) as vB, vA-vB as diff FROM MyTable 我尝试了这段代码,但编译器告诉我表达式vA vB as diff中的新动态列vA和vB无法识别 SELECT Name, CASE WHEN exp

我想将此MS Access动态查询示例转换为T-SQL:

SELECT 
    Name, 
    iif(expression='A', value, 0) as vA,
    iif(expression='B', value, 0) as vB,
    vA-vB as diff
FROM 
    MyTable
我尝试了这段代码,但编译器告诉我表达式
vA vB as diff
中的新动态列vA和vB无法识别

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

不能使用同一select语句中定义的别名。试试这个

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
或者作为
子选择进行查询
,并在
外部查询中查找
diff

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 

当行完成处理时,将定义别名。因此,它们在同一行的其他位置的“读取”上下文中不可用。在
SELECT
子句中可以使用别名,这是访问的许多特性之一,尽管据我所知,它们必须按顺序定义。这可能很有用,但如果查询中有一个与表字段同名的计算字段,这可能会是一场噩梦。