sql相除的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql相除的问题相关的知识,希望对你有一定的参考价值。

(select ts_count/bj_count from tb_bian_shangpin )
ts_count:100 int
bj_count:200 int
为什么查询出的结果是 0

SELECT field1/field2 FROM TB;
当 field1的数值 > field2的数值时,除法得出的结果是<1的,即0.xxxxxx
这个时候在DB2的环境下SELECT出来的值是0
解决方法:
先把field1转换成DOUBLE类型的,这样计算出来的就会得出小数点了,会显示出0.xxxx
SELECT CAST(field1 AS FLOAT)/field2 FROM TB;
ps.网上搜的资料,写的是double,但在SQL Server2008中一直报错,改成FLOAT就没问题了。
小数点显示4位小数。可以进一步四舍五入,保留两位小数点
SELECT ROUND(CAST(field1 AS DOUBLE)/field2, 2) FROM TB;
如果数据列的值为NULL,将其设置为0,那么sql就要这么写
SELECT ROUND(COALESCE(CAST(field1 AS DOUBLE), 0)/field2, 2) FROM TB;
COALESCE这个函数系统的用法如下:
a. 输入参数为字符类型,且允许为空的,可以使用COALESCE(inputParameter,”)把NULL转换成”;
b. 输入类型为整型,且允许为空的,可以使用COALESCE(inputParameter,0),把空转换成0;
c. 输入参数为字符类型,且是非空非空格的,可以使用COALESCE(inputParameter,”)把NULL转换成”,然后判断函数返回值是否为”;
d. 输入类型为整型,且是非空的,不需要使用COALESCE函数,直接使用IS NULL进行非空判断。
参考技术A 解决方法:

先把field1转换成DOUBLE类型的,这样计算出来的就会得出小数点了,会显示出0.xxxx
SELECT CAST(field1 AS FLOAT)/field2 FROM TB;
ps.网上搜的资料,写的是double,但在SQL Server2008中一直报错,改成FLOAT就没问题了。
小数点後显示4位小数。

 可以进一步四舍五入,保留两位小数点
SELECT ROUND(CAST(field1 AS DOUBLE)/field2, 2) FROM TB;
不过因为我要用到百分比,就改成了
SELECT CAST(field1 AS FLOAT)/field2 * 100 FROM TB;
然後再页面显示时再加上“%”

如果数据列的值为NULL,将其设置为0,那么sql就要这么写
  SELECT ROUND(COALESCE(CAST(field1 AS DOUBLE), 0)/field2, 2) FROM TB;
  COALESCE这个函数系统的用法如下:
  a. 输入参数为字符类型,且允许为空的,可以使用COALESCE(inputParameter,”)把NULL转换成”;
  b. 输入类型为整型,且允许为空的,可以使用COALESCE(inputParameter,0),把空转换成0;
  c. 输入参数为字符类型,且是非空非空格的,可以使用COALESCE(inputParameter,”)把NULL转换成”,然后判断函数返回值是否为”;
  d. 输入类型为整型,且是非空的,不需要使用COALESCE函数,直接使用IS NULL进行非空判断。
参考技术B int值计算最后结果还是int值,可以将其中一个强制转换为小数
select ts_count/CAST(bj_count AS decimal(10,4) from tb_bian_shangpin本回答被提问者采纳
参考技术C sqlserver:

select cast(ts_count/bj_count as double) from tb_bian_shangpin ;

select cast(ts_count/bj_count as numeric(10,4) ) from tb_bian_shangpin ;
参考技术D 夜来香叶子发黄怎么办

将聚合函数中的两个值相除?

【中文标题】将聚合函数中的两个值相除?【英文标题】:Divide two values in aggregation functions? 【发布时间】:2020-11-21 01:41:26 【问题描述】:

我有一个这样的表格视图:

week    ColB    ColF
---------------------
45      1234    PART
45      8215    TEMP
45      2834    PART
45      4152    PART
45      5775    TEMP
45      6527    PART
45      1162    TEMP
45      9154    
45      2162    
46      4232    PART
46      3215    PART
46      5834    PART
46      6152    PART
46      7775    TEMP
46      8527    PART
46      9162    TEMP
46      2354    
46      2562    
46      9762    
...
...
...

现在每周我需要做以下事情:

每周共有多少个PARTTEMP。我们称之为total。在ColF 中,除了PARTTEMP 之外,我还可以有其他值,例如空字符串或任何其他值。我只需要计算PARTTEMP。 每周有多少TEMP。我们称之为temp。 对于每周,将temp/total 相除,得到result 的小数点后三位。如果result 为 0,那么它应该只显示 0。

所以输出应该是这样的。基本上按周列分组。

week    ratio
---------------------
45      0.054
46      0.345
47      0.224
48      0.456

所以我尝试了这样,它完成了工作,但是我需要先计算百分比然后除以 100 才能得到我需要的吗?我确实认为这可以改进,所以我不应该先计算百分比。我应该能够在不做百分比的情况下得到结果。

select week, (avg(case when colf = 'TEMP' then 100.0 else 0 end) / 100 ) as ratio
from process 
where colf in ('PART', 'TEMP')
group by week

这有可能吗?

【问题讨论】:

【参考方案1】:

您只需使用1.0即可简化比率计算:

select week, avg(case when colf = 'TEMP' then 1.0 else 0 end) as ratio
from process 
where colf in ('PART', 'TEMP')
group by week;

或者,更简单地说:

select week, avg( (colf = 'TEMP')::int ) as ratio
from process 
where colf in ('PART', 'TEMP')
group by week;

Here 是一个 dbfiddle(使用 Postgres)。

【讨论】:

我尝试了您的第一个建议,我收到了 0 几个星期,但它们的值是 0.027。知道为什么会这样吗? 你用的是1.0还是1? 正是您在第一个建议中的内容。 @AndyP 。 . .我添加了一个 dbfiddle(使用 Postgres)。 我用的是redshift数据库,有什么不同吗?【参考方案2】:

基于 Gordon 的回答,小数点后面的零应该与要返回的小数位数相匹配 - 这是我为 redshift 找到的。

选择周,平均(colf = 'TEMP' 然后 1.000 否则 0 结束的情况)作为比率 从过程 colf in ('PART', 'TEMP') 按周分组;

【讨论】:

以上是关于sql相除的问题的主要内容,如果未能解决你的问题,请参考以下文章

两个sql语句查询出来的值相除

如何编写 BigQuery/SQL 查询以将一个表中的列的平均值与第二个/另一个表中的列相除

sql查询用到两个字段相除,如何让他保留小数两位

sql 中相除后怎么得个百分数

SQL Server 小数类型(float 和 decimal)小数相除求占比为1的方法

delphi整型变量相除,要求结果为小数