如何在SQL中计算比率并满足除零的要求

如何在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

我需要根据下面的数据集生成一份报告。报告应显示每天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  | 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
的乘法,我强制将值设置为十进制或浮点,现在除法不会截断。