sql相除的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql相除的问题相关的知识,希望对你有一定的参考价值。
(select ts_count/bj_count from tb_bian_shangpin )
ts_count:100 int
bj_count:200 int
为什么查询出的结果是 0
当 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
...
...
...
现在每周我需要做以下事情:
每周共有多少个PART
和TEMP
。我们称之为total
。在ColF
中,除了PART
和TEMP
之外,我还可以有其他值,例如空字符串或任何其他值。我只需要计算PART
和TEMP
。
每周有多少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相除的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何编写 BigQuery/SQL 查询以将一个表中的列的平均值与第二个/另一个表中的列相除