如何在SQL中计算比率并满足除零的要求
我需要根据下面的数据集生成一份报告。报告应显示每天P、U、D、F和M列的总和,以及聚合形式的比率:M/P+U 我在比率方面遇到了问题。我不知道怎样才能应付零分制如何在SQL中计算比率并满足除零的要求,sql,tsql,null,Sql,Tsql,Null,我需要根据下面的数据集生成一份报告。报告应显示每天P、U、D、F和M列的总和,以及聚合形式的比率:M/P+U 我在比率方面遇到了问题。我不知道怎样才能应付零分制 TYP | TIMESTAMP | P | U | D | F | M ------------------------------------------------------------ L | 2012-04-27 15:47:02.000 | 0 | 949 | 0 | 0
TYP | TIMESTAMP | P | U | D | F | M
------------------------------------------------------------
L | 2012-04-27 15:47:02.000 | 0 | 949 | 0 | 0 | 949
L | 2012-04-27 15:48:18.000 | 0 | 949 | 0 | 0 | 949
L | 2012-04-30 17:15:01.000 | 0 | 0 | 4051| 0 | 0
L | 2012-04-30 17:44:44.000 | 0 | 984 | 5 | 0 | 986
L | 2012-05-02 11:12:01.000 | 2117| 0 | 0 | 0 | 0
L | 2012-05-02 11:12:09.000 | 149 | 4 | 210 | 0 | 157
L | 2012-05-02 11:12:11.000 | 77 | 0 | 30 | 0 | 43
我的问题是:
SELECT
CONVERT(date,TIMESTAMP,112) As 'DAY',
SUM(P) As PAS,
SUM(U) As UFR,
SUM(D) As DES,
SUM(F) As FIR,
SUM(M) As MOL,
[M%] = ISNULL( (SUM(M) / NULLIF( SUM(P)+SUM(U), 0 ) )*100, 0),
FROM DATASET
GROUP BY CONVERT(date,TIMESTAMP,112) ORDER BY CONVERT(date,TIMESTAMP,112) DESC
更新:这是报告
DAY | PAS | UFR | DES | FIR | MOL | M%
----------------------------------------------------------------
2012-05-02 | 2343 | 4 | 240 | 0 | 200 | 0
2012-04-30 | 0 | 984 | 4056 | 0 | 986 | 100
2012-04-27 | 0 | 1898 | 0 | 0 | 1898 | 100
问题是您没有考虑整数除法
Select Cast([Timestamp] As Date) As 'Day'
, Sum(P) As Pas
, Sum(U) As Ufr
, Sum(D) As Des
, Sum(F) As Fir
, Sum(M) As Mol
, IsNull( (Sum(M) / NullIf( Sum(P) * 1.0000 + Sum(U), 0 ) ) *100, 0) As [M%]
From Dataset
Group By Cast([Timestamp] As Date)
Order By [Day] Desc
版本问题在于您没有考虑整数除法
Select Cast([Timestamp] As Date) As 'Day'
, Sum(P) As Pas
, Sum(U) As Ufr
, Sum(D) As Des
, Sum(F) As Fir
, Sum(M) As Mol
, IsNull( (Sum(M) / NullIf( Sum(P) * 1.0000 + Sum(U), 0 ) ) *100, 0) As [M%]
From Dataset
Group By Cast([Timestamp] As Date)
Order By [Day] Desc
你能详细说明一下这个问题吗?除非我遗漏了什么,否则你的NULLIF似乎可以处理被0除的情况。如果有被0除的情况,你希望结果是什么?例如,它应该是空的,“NaN”(不是一个数字),还是报告中要显示的其他指标?现在我没有得到5月2日的0,当时它应该在8.5%左右(=200/2347)。请参阅上面的报告。如果这些列是整数,则除法的结果也将是整数。尝试将除数转换为十进制:
将(SUM(P)+SUM(U)转换为十进制(12,2))
@NikolaMarkovinović是的,我想我明白你的意思了。谢谢你能详细说明一下这个问题吗?除非我遗漏了什么,否则你的NULLIF似乎可以处理被0除的情况。如果有被0除的情况,你希望结果是什么?例如,它应该是空的,“NaN”(不是一个数字),还是报告中要显示的其他指标?现在我没有得到5月2日的0,当时它应该在8.5%左右(=200/2347)。请参阅上面的报告。如果这些列是整数,则除法的结果也将是整数。尝试将除数转换为十进制:将(SUM(P)+SUM(U)转换为十进制(12,2))
@NikolaMarkovinović是的,我想我明白你的意思了。谢谢我不确定我是否完全理解为什么这些值是正确的。谢谢@绿色-在您的版本中,有返回整数的Sum(P)+Sum(U)
。将一个整数除以另一个整数时,系统会将该值截断为整数。通过将*1.0000
的乘法相加,我强制将值设为十进制或浮点,现在除法将不会截断。我不确定我是否完全理解为什么By值是正确的。谢谢@绿色-在您的版本中,有返回整数的Sum(P)+Sum(U)
。将一个整数除以另一个整数时,系统会将该值截断为整数。通过添加*1.0000
的乘法,我强制将值设置为十进制或浮点,现在除法不会截断。