2016-09-29 35 views
1

我有一個像十字派生列適用於SQL與CASE表達式

SELECT COL1 , COL2,COL3 
COL4 = (COL1-(COL2*.15)) 
COL5 = (COL3*(COL1*1.5)) 

FROM TABLE1 AS A 
INNER JOIN TABLE2 AS B 
ON A.ID = B.ID 

現在我試圖把Case語句使用計算列值少計算列很簡單的查詢,跨應用

CROSS APPLY (

SELECT REMARKS = CASE WHEN COL4> COL1 THEN GOOD ELSE BAD END 

但這是給錯誤。

在輸出我期待所有列即COL1,COL2,COL3,COL4,COL5,備註

有人請所說的其實是我的錯?

+1

請加RDBMS標籤。請看[how-to-ask](http://stackoverflow.com/help/how-to-ask) – swe

+0

你得到的錯誤信息是什麼? – JohnHC

+0

首先嚐試顯示錯誤。其次,例如。計算col4以便將計算放入大小寫,而不是col4 – Nebi

回答

1

的問題是,因爲它是第一個評價CROSS APPLY不能從SELECT條款訪問計算字段。

一種選擇是使用一個CROSS APPLY爲每列級聯的計算列:

SELECT COL1, COL2, COL3, 
     C.COL4, D.COL5, 
     E.REMARKS 
FROM TABLE1 AS A 
INNER JOIN TABLE2 AS B ON A.ID = B.ID 
CROSS APPLY (SELECT COL4 = (COL1-(COL2*.15))) AS C 
CROSS APPLY (SELECT COL5 = (COL3*(COL1*1.5))) AS D 
CROSS APPLY (SELECT REMARKS = CASE WHEN C.COL4 > COL1 THEN 'GOOD' ELSE 'BAD' END) AS E 

Demo here

+0

謝謝.....如果col1,col2和col3來自不同的表格,它會工作嗎?請建議 –

+0

@RohiniMathur是的,它會工作。只需在字段名稱前使用表別名,以消除y歧義。 –

+0

@RohiniMathur我的查詢缺少一個逗號。我修正了這個問題。除此之外,查詢似乎執行OK。請檢查附帶的小提琴演示。 –

1

這是怎麼回事?

SELECT *,CASE WHEN COL4 > COL1 THEN 'GOOD' ELSE 'BAD' END AS Remark 
FROM (
     SELECT COL1 , COL2,COL3 
     COL4 = (COL1-(COL2*.15)) 
     COL5 = (COL3*(COL1*1.5)) 
     FROM TABLE1 AS A 
     INNER JOIN TABLE2 AS B ON A.ID = B.ID 
)M 
+1

也是我的想法... – swe

0

括在SELECT語句中的第一個腳本,然後做跨應用

SELECT * FROM (SELECT COL1 , COL2,COL3 
       ,COL4 = (COL1-(COL2*.15)) 
       ,COL5 = (COL3*(COL1*1.5)) 

FROM TABLE1 AS A 
INNER JOIN TABLE2 AS B 
ON A.ID = B.ID)t 

CROSS APPLY 

(
SELECT CASE WHEN t.COL4 > t.COL1 THEN 'GOOD' ELSE 'BAD' END REMARKS 
) t1 
+0

錯誤消息是消息102,級別15,狀態1,過程ComparePrices,行39 'END'附近的語法不正確。 –

+0

使用更新的查詢 –

0
Select x.Iss_Carat,x.Rec_Carat,x.REMARKS from Process_Issue_Receive PTR 
cross apply(SELECT *, REMARKS = CASE WHEN Rec_Carat> Iss_Carat THEN 'GOOD' 
           ELSE 'BAD' 
           END FROM LAB_Issue_Receive LIR where ptr.Lot_Key = LIR.Lot_key)x where x.REMARKS = 'GOOD' 

嘗試此查詢與2 DIFF表