2017-05-31 133 views
1

我试图计算项目的总成本,并将该值转换为称为成本的新列。SQL将varchar转换为货币

在我的创建脚本中,值是字符,但数据类型是金钱。

CREATE VIEW ordered_pizzas_view 
AS 
    SELECT 
     orderpizza_id, order_id, ..., 
     CONCAT(range_price, ' ', crust_surcharge, ' ', sauce_surcharge) AS 'cost' 
    FROM 
     order_pizza 
    INNER JOIN 
     ... 
    WHERE 
     'cost' = (SELECT SUM(CAST(range_price AS MONEY)) FROM pizza_range) + 
       (SELECT SUM(CAST(crust_surcharge AS MONEY)) FROM crust) + 
       (SELECT SUM(CAST(Sauce_surcharge AS MONEY)) FROM sauce) 
+0

您是否检查表中的值,是否有非数字条目? – SAS

+0

我刚刚注意到SQL语法错了,你不能用char来比较钱.. – SAS

回答

3

什么是你从concat()期待? concat()返回一个字符串值,根据您输入的值将是由空格分隔的三个金额值,例如, $1.00 $2.00 $0.50

将它与货币值比较会引发错误。也许你打算只是增加值?

(range_price + crust_surcharge + sauce_surcharge) as [cost] 

注意:不要使用字符串文字作为别名。


此外,您的where子句进行比较来从组合的子查询一个money数据类型的字符串文字('cost')。

where --'cost' 
     (range_price + crust_surcharge + sauce_surcharge) 
       = (select Sum(CAST(range_price as money)) from pizza_range) 
      + (select Sum(CAST(crust_surcharge as money)) from crust) 
      + (select Sum(CAST(Sauce_surcharge as money)) from sauce) 

注意:您不能where子句中使用列别名,你必须重复表达或从一个子查询/派生表或其他经营者引用的表达。

+0

感谢SQLZim,回答了我的一个问题,非常感谢 – MacGenius

+0

@MacGenius乐于帮忙! – SqlZim