2009-11-08 13 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.pngLa colonne calculée peut-elle être utilisée dans une autre colonne calculée?

Je veux colonne calculée (ExchangeRatePrice) à utiliser dans CalculatedPrice. Puis-je l'utiliser directement pour le convertir?

J'ai utilisé 10 * Prix juste pour vous montrer l'exemple parce que si je l'utilise « ExchangeRatePrice » ici, il donnera erreur « Invalid colonne »

+0

Voulez-vous dire la colonne dérivée? –

Répondre

1

Pour faire référence à pré-calculer une valeur dans SQL signifie généralement l'exécution du calcul d'une requête interne (AKA vue en ligne):

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 

Ceci est l'équivalent à l'aide de la clause WITH (disponible en SQL Server 2005+) - il n'y a pas de différence de performance.

Vous pouvez dupliquer la logique:

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 

..mais cela signifie que la duplication & risque inhérent d'une personne non mise à jour les deux cas, de garder synchronisés.

0

Oui. Utilisation "AVEC" (Common Table Expressions)

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

La clause 'WITH' est uniquement prise en charge pour SQL Server 2005+. –

0

Vous ne pouvez pas utiliser des alias de colonne jusqu'à ce que la clause ORDER BY.

Mais vous pouvez utiliser des alias de colonne définis dans une sous-requête.

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