0

这是我的 SQL 及其来自 Select 语句的片段......它运行良好,但现在我必须从 CAST 中删除硬编码值......我输入十进制(38,2) 我希望它是从BaseCurrencyDP.NumberOfDecimalPlaces替换

但它说 Integer 预期,并且此列NumberofDecimalPlacestinyint.

请指导

select distinct
a,
b,
c,

CASE 
When @userOriginalCurrencyCode IS NOT NULL -- Case For Original Currency Filled in Criteria .
Then SUM(CASE WHEN EmployeeHeader.EmployeePremiumType  = 2 THEN EmployeeAmount.TransactionClosedAmountOriginal ELSE 0 END) 
When @userAccountingCurrencyCode IS NOT NULL
THEN SUM(CASE WHEN EmployeeHeader.EmployeePremiumType  = 2 THEN EmployeeAmount.TransactionClosedAmountAccounting ELSE 0 END ) 
ELSE CASE

WHEN (select COUNT( DISTINCT( EmployeeAmountGroup.OriginalCurrencyCode )) from user.EmployeeAmountGroup  Where EmployeeAmountGroup.EmployeeHeaderID = EmployeeHeader.EmployeeHeaderID )<>1
 THEN                      
    CASE WHEN(select COUNT( DISTINCT( EmployeeAmountGroup.AccountingCurrencyCode )) from user.EmployeeAmountGroup  Where EmployeeAmountGroup.EmployeeHeaderID = EmployeeHeader.EmployeeHeaderID)<>1
       THEN       
            CAST(ROUND(SUM(CASE WHEN EmployeeHeader.EmployeePremiumType  = 2 THEN EmployeeAmount.TransactionClosedAmountBase ELSE 0 END ),BaseCurrencyDP.NumberOfDecimalPlaces) AS Decimal(38,2))
       ELSE CAST(ROUND(SUM(CASE WHEN EmployeeHeader.EmployeePremiumType  = 2 THEN EmployeeAmount.TransactionClosedAmountAccounting ELSE 0 END ),BaseCurrencyDP.NumberOfDecimalPlaces) AS Decimal(38,2))
    END                           
 ELSE CAST(ROUND(SUM(CASE WHEN EmployeeHeader.EmployeePremiumType  = 2 THEN EmployeeAmount.TransactionClosedAmountOriginal ELSE 0 END ),BaseCurrencyDP.NumberOfDecimalPlaces) AS Decimal(38,2))
END
End as TotalClosedAmount,

请指导

4

1 回答 1

0

您可以使用此功能来格式化您的数据

Create FUNCTION [dbo].[fnFormatCurrency] (@value Decimal(24, 7), @NumberOfDecimals int) 
RETURNS VARCHAR(32) 
AS 
BEGIN 
    DECLARE @temp varchar(38)

    IF @NumberOfDecimals > 0
    BEGIN
        SET @temp = PARSENAME('$'+ Convert(varchar,Convert(money,@value),1),2)
        SET @temp = @temp + RIGHT(str(@value, 32, @NumberOfDecimals) , @NumberOfDecimals + 1)
    END
    ELSE
    BEGIN
        SET @temp = PARSENAME('$'+ Convert(varchar,Convert(money,cast(round(@Value, 0) as int)),1),2)
    END

    RETURN @temp
END 

如本文所述http://social.msdn.microsoft.com/Forums/sqlserver/en-US/4a6c3745-8a0e-4474-9d76-67bae3f2a040/format-currency-and-percentage-with-variable-number-of -decimal-places?forum=transactsql

或者你可以使用这个丑陋的表单查询

declare @decimals tinyint
set @decimals = 5
declare @sql as nvarchar(max)
set @sql = 'select cast(15.8 as Decimal(38,'+cast(@decimals as varchar)+' ))'
exec sp_executesql @sql

我希望这有帮助。

于 2014-04-06T10:47:44.747 回答