2014-12-19 30 views
2

我想的MS Access動態查詢的這個例子中轉換成T-SQL:在SQL Server中轉換的MS Access動態列

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

你的別名的定義時,該行完成處理。因此它們不在同一行其他地方的「讀取」上下文中。 –

回答

3

您不能使用在同一個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 

或使查詢作爲Sub select並找到diffouter 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