简体   繁体   English

使用Case Expression在带SQL的派生列中交叉应用

[英]Cross Apply with Derived Column In SQL with Case Expression

I have very simple query with few computed column like 我有非常简单的查询,很少有计算列

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

Now i am trying to put Case statement on computed column value using cross apply 现在我试图使用交叉应用将Case语句放在计算列值上

CROSS APPLY (

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

but this is giving error . 但这是错误的。

In Output I am expecting all column ie col1,col2,col3,col4,col5,Remarks 在输出中我期待所有列,即col1,col2,col3,col4,col5,备注

Can someone please suggest what is my mistake? 有人可以建议我的错误是什么?

The problem is that CROSS APPLY cannot access a computed field from the SELECT clause because it is evaluated first. 问题是CROSS APPLY无法从SELECT子句访问计算字段,因为它首先被计算。

One option is to cascade your computed columns using one CROSS APPLY for each column: 一种选择是使用每个列的一个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 在这里演示

What about this? 那这个呢?

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

Enclose your first script in select statement then do cross apply 将您的第一个脚本包含在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
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'

Try This Query with 2 Diff Table 使用2 Diff Table尝试此查询

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM