【问题标题】:SQL Currency FormattingSQL 货币格式
【发布时间】:2016-03-08 01:06:14
【问题描述】:

我在尝试将查询转换为货币格式时遇到了问题。下面是代码,在尝试对“购买”总和进行转换时,我不断收到两条不同的错误消息。

使用时:

sum(case 
when trandate between '2015-01-01' and '2015-03-31'
     then format(purchases, 'C', 'en-US') 
else 0 end) as q1 

我收到错误消息 102

使用时:

sum(case 
when trandate between '2015-01-01' and '2015-03-31'
     then ('$' + CONVERT(varchar(12), purchases, 1))
else 0 end) as 'Q1 2015'

我收到错误消息 245。

我似乎无法找到解决方案。当只是简单地在行级别查询数据并使用两种格式时,我会得到 $xxx 返回。任何帮助将不胜感激。

干杯

【问题讨论】:

  • 您使用的是哪种 SQL 变体?
  • 将 else 分支添加到您的案例陈述中
  • 抱歉没有从我的查询中复制手动输入...否则 0 end) 是案例陈述的一部分

标签: sql sql-server formatting currency


【解决方案1】:

当使用 CASE 表达式时,结果表达式的数据类型会从一种到另一种转换为相同的数据类型

case when trandate between '2015-01-01' and '2015-03-31'
     then format(purchases, 'C', 'en-US') 
     else 0 
     end

在上面的 case 表达式中,结果中有 2 种不同的数据类型。一个是字符串,另一个是整数。 SQL Server 会将字符串转换为整数。它无法并抛出该错误。

您应该在显示结果的前端应用程序中执行值的格式化。

如果您真的必须在 T-SQL 中执行,请将 else 更改为 '0'

else '0'

编辑 1:

由于你有 SUM(),你应该在 SUM 之后而不是之前转换。否则,您将对同样不起作用的字符串应用 SUM()。

format (
         SUM (case when trandate between '2015-01-01' and '2015-03-31'
                   then purchases -- format(purchases, 'C', 'en-US') 
                   else 0 
                   end) , 'C', 'en-US')

【讨论】:

  • 我在脚本中使用了 else '0',在 '2015-01-01' 和 '2015-03-31' 之间转换时使用脚本案例的结果相同,然后 format(purchases, ' C', 'en-US') else 0 end
  • 哦...注意你有 SUM () 那里。 . .我会更新这篇文章
  • 完美,这就是我想要的。谢谢!
猜你喜欢
  • 2014-10-22
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多