2009-11-08 101 views
2
SELECT ExchangeRatePrice = CASE pp.Price 
    WHEN NULL THEN 0 
     ELSE (CASE WHEN c.CurrencyId = 1 THEN pp.Price 
     ELSE CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) END) 
    END , 

    price as OriginalPriceInDB, 
    10 * Price as CalculatedPrice, 
    c.currencyid as Currency 

FROM ProductPrice pp, currency c 

alt text http://img682.imageshack.us/img682/3692/exchangerate.png可以在另一个计算列中使用计算列吗?

我想计算列(ExchangeRatePrice)在CalculatedPrice使用。我可以直接使用它吗?我需要再次转换它吗?

我已经使用了10 *价格只是给你看的例子,因为如果我使用“ExchangeRatePrice”这会给错误“无效列名”

+0

你的意思是派生列吗? – 2009-11-08 01:04:19

回答

1

要引用预先计算在SQL的值通常是指在一个内部查询执行计算(AKA线视图):在

SELECT x.exchangerateprice, 
     x.OriginalPriceInDB, 
     10 * x.exchangerateprice AS CalculatedPrice, 
     x.currencyid 
    FROM (SELECT CASE 
       WHEN pp.price IS NULL THEN 
        0 
       WHEN c.CurrencyId = 1 THEN 
        pp.Price 
       ELSE 
        CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) 
       END AS ExchangeRatePrice, 
       price as OriginalPriceInDB, 
       c.currencyid as Currency 
     FROM PRODUCTPRICE pp, 
       CURRENCY c) x 

这是相当于使用WITH子句(购SQL Server 2005+) - 性能没有差别。

你可以复制的逻辑:

SELECT CASE 
     WHEN pp.price IS NULL THEN 
      0 
     WHEN c.CurrencyId = 1 THEN 
      pp.Price 
     ELSE 
      CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) 
     END AS ExchangeRatePrice, 
     price as OriginalPriceInDB, 
     CASE 
      WHEN pp.price IS NULL THEN 
      0 
      WHEN c.CurrencyId = 1 THEN 
      pp.Price 
      ELSE 
      CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) 
     END * 10 AS CalculatedPrice, 
     c.currencyid as Currency 
    FROM PRODUCTPRICE pp, 
     CURRENCY c 

..但是那意味着某人没有更新这两个实例保持同步复制&固有风险。

0

是。使用“WITH”(通用表表达式)

With MainT as (
    SELECT CASE pp.Price 
     WHEN NULL 
     THEN 0 
     ELSE (
      CASE WHEN c.CurrencyId = 1 THEN pp.Price 
      ELSE CONVERT(DECIMAL(9, 2), (pp.Price * c.ExchangeRate)) END 
      ) 
     END ExchangeRatePrice, 
     price as OriginalPriceInDB, 
     c.currencyid as Currency 
    FROM ProductPrice pp, currency c 
) 
select *, 10*ExchangeRatePrice as CalculatedPrice 
from MainT 
+0

只有SQL Server 2005+支持'WITH'子句。 – 2009-11-08 00:35:41

0

不能使用列别名直到ORDER BY条款。

但是你可以使用在子查询中定义的列别名。

SELECT x * 10 AS y 
FROM (SELECT 123 AS x) tbl