【问题标题】:Decimal function in SQL Server 2005 not working as intendedSQL Server 2005 中的十进制函数未按预期工作
【发布时间】:2013-11-06 18:46:46
【问题描述】:
select 
screenname,
count(*) as Total_SignIns
,count(distinct(startdate)) as Uniq_Days_Signin
, ROUND(CONVERT(DECIMAL(4,2), count(*))/CONVERT(DECIMAL(4,2), count(distinct(startdate))), 2) AS AverageDaySingIn
from (
    select distinct(id), x.screenname, startdate, cast(startdate+' '+starttime as datetime) as startdatetime, x.boxadollar
    from sitelive.dbo.exsignin x (nolock)
    inner join (
            select distinct(SenderScreennameSimple), ReceiverScreennameSimple, convert(char(8),dateentered,1) as Poke_date
                ,(select top 1 Dateentered from Temp.dbo.poketemp 
                    where n.ReceiverScreennameSimple = ReceiverScreennameSimple and n.SenderScreennameSimple = SenderScreennameSimple and convert(char(8),n.dateentered,1) = convert(char(8),dateentered,1) 
                    Order by DateEntered) as Poke
                ,(select top 1 Dateentered from Temp.dbo.poketemp 
                    where n.ReceiverScreennameSimple = ReceiverScreennameSimple and n.SenderScreennameSimple = SenderScreennameSimple and convert(char(8),n.dateentered,1) = convert(char(8),dateentered,1) 
                    Order by DateEntered desc) as Poke_Lst
            ,count(*) as Poke_Count
            from Temp.dbo.poketemp n
            Group by SenderScreennameSimple, ReceiverScreennameSimple, convert(char(8),dateentered,1)
            having count(*) = 1
            ) t1 on t1.SenderScreennameSimple = x.screenname
    where datediff(minute,Poke,cast(startdate+' '+starttime as datetime) ) Between 0 and 60 and LiveOrRecorded = 'L'
) t2
Group by  
screenname

以上是我使用的示例查询,结果集包含:

AverageDaySignIn
1.0000000
1.0000000
1.0000000
1.0000000
1.0000000
2.4500000
2.0000000
1.6700000
1.0000000
1.3300000... and so on

我什至尝试过:

, ROUND(CONVERT(DECIMAL(3,2), count(*))/CONVERT(DECIMAL(3,2), count(distinct(startdate))), 2) AS AverageDaySingIn

我收到此错误:

Arithmetic overflow error converting int to data type numeric.

我做错了什么?对不起noob'ness,任何帮助将不胜感激。提前谢谢你。

【问题讨论】:

  • 尝试将小数位数从 4 增加到 18
  • 这样做了,它增加了位数:1.00000000000000000000

标签: sql sql-server function sql-server-2005 decimal


【解决方案1】:

numbers 看起来像您期望的那样四舍五入到 2 位,但 display 不是 - 您可以使用 STR 来控制显示:

SELECT
screenname,
COUNT(*) as Total_SignIns
,COUNT(DISTINCT startdate ) as Uniq_Days_Signin
, STR(
    ROUND(COUNT(*)/COUNT(DISTINCT startdate ), 2) 
    , 10, 2) AS AverageDaySingIn
FROM(
...

【讨论】:

  • 成功了,谢谢 D Stanley!网上有没有解释这个STR功能的文章?我得到的所需输出现在:AverigerAdeSignIn 1.00 1.00 2.00 1.00 1.50 2.00 1.00 1.50 1.60 1.67 3.33 2.00 2.00 1.00 1.00 1.17 1.00 1.00 1.00 1.14 1.00 3.00 2.00 2.00 1.67 4.00 2.00 1.00 2.00 2.00 4.00 4.75 2.00 2.00 4.00 4.75 1.33 SPAN>
  • @user2961803 添加了文档链接。
【解决方案2】:

DECIMAL(4,2) 允许您有 2 位小数,并且小数点左侧只有 2 位。来自MSDNdecimal的定义:

十进制[ (p[ , s] )] p = 精度 - 可以存储的小数位数的最大总数,包括小数点的左侧和右侧。精度必须是 1 到最大精度 38 之间的值。默认精度为 18。

您应该提高精度以允许更大的数字,例如到DECIMAL(18,2)

【讨论】:

    猜你喜欢
    • 2020-10-08
    • 2021-04-30
    • 2012-01-19
    • 2018-02-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多