0
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

2 回答 2

0

DECIMAL(4,2)允许您有 2 位小数,并且小数点左侧只有 2 位。decimal根据MSDN上的定义:

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

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

于 2013-11-06T18:59:50.080 回答
0

看起来数字像您期望的那样四舍五入到 2 位,但显示不是 - 您可以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(
...
于 2013-11-06T19:40:05.347 回答