[英]SQL Server: how to use manually defined column name for case statement
我将以下“选择”用作更大查询的一部分。
这里有人可以告诉我如何在我的Case语句中引用手动定义的名称“ amountUSD
”吗? 尝试以这种方式保存它时,总是出现以下错误:“ Invalid column name 'amountUSD'.
”
解决方法可能是先将其插入到临时表中,但我希望可以避免这种情况。
SELECT (CASE WHEN R.currency = 'USD' THEN '1' ELSE E.exchange_rate END) AS exchangeRate,
(R.amount * E.exchange_rate) AS amountUSD,
(
CASE WHEN amountUSD < 1000 THEN '18'
WHEN amountUSD < 5000 THEN '25'
WHEN amountUSD < 20000 THEN '27'
WHEN amountUSD < 100000 THEN '28'
WHEN amountUSD < 250000 THEN '29'
WHEN amountUSD < 2000000 THEN '30'
WHEN amountUSD < 5000000 THEN '31' END
) AS approvalLevel
FROM Exchange_Rates E
WHERE E.from_currency = R.currency
AND E.to_currency = 'USD'
FOR XML PATH(''), ELEMENTS, TYPE
蒂姆,非常感谢您对此提供的任何帮助。
您不能-因为此时不存在amountUSD。 它仅存在于输出投影中。 您有2个选择:
不使用金额USD或
不使用您的表,而是进行两步查询,首先查询项目金额USD,然后选择该金额并在其中进行验证(approvalLevel)。
这听起来并不像您可以在另一个选择上进行选择那样困难。
这样行吗?
SELECT (CASE WHEN R.currency = 'USD' THEN '1' ELSE E.exchange_rate END) AS exchangeRate,
(R.amount * E.exchange_rate) AS amountUSD,
(
CASE WHEN (R.amount * E.exchange_rate) < 1000 THEN '18'
WHEN (R.amount * E.exchange_rate) < 5000 THEN '25'
WHEN (R.amount * E.exchange_rate) < 20000 THEN '27'
WHEN (R.amount * E.exchange_rate) < 100000 THEN '28'
WHEN (R.amount * E.exchange_rate) < 250000 THEN '29'
WHEN (R.amount * E.exchange_rate) < 2000000 THEN '30'
WHEN (R.amount * E.exchange_rate) < 5000000 THEN '31' END
) AS approvalLevel
FROM Exchange_Rates E
WHERE E.from_currency = R.currency
AND E.to_currency = 'USD'
FOR XML PATH(''), ELEMENTS, TYPE
之所以无法在SELECT列表中使用amountUSD,是因为查询处理的逻辑顺序为: http : //tsql.solidq.com/books/insidetsql2008/Logical%20Query%20Processing%20Poster.pdf
我相信以下代码是TomTom所描述的可行解决方案之一。
SELECT *
,(CASE WHEN amountUSD < 1000 THEN '18'
WHEN amountUSD < 5000 THEN '25'
WHEN amountUSD < 20000 THEN '27'
WHEN amountUSD < 100000 THEN '28'
WHEN amountUSD < 250000 THEN '29'
WHEN amountUSD < 2000000 THEN '30'
WHEN amountUSD < 5000000 THEN '31' END
) AS approvalLevel
FROM
(
SELECT (CASE WHEN R.currency = 'USD' THEN '1' ELSE E.exchange_rate END) AS exchangeRate,
(R.amount * E.exchange_rate) AS amountUSD,
FROM Exchange_Rates E
WHERE E.from_currency = R.currency
AND E.to_currency = 'USD'
) t
FOR XML PATH(''), ELEMENTS, TYPE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.