SQL如何做除法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL如何做除法相关的知识,希望对你有一定的参考价值。
上图是我用代码1 实现的效果。我想在代码1的基础上实现下图,即先统计每个orgin-destination每个MOT的SH个数 占 该orgin-destination所有SH个数 的百分比, 然后筛选出该百分比小于等于0.01的。
代码1:
SELECT ORIGIN+' - '+DESTINATION as [origin-destination],MODEOFTRANSPORT,COUNT(SHIPMENTID) AS [SH/LANE/MOT]
FROM ['TMS$']
where PRIORITY = 'Standard'
group by ORIGIN,DESTINATION,MODEOFTRANSPORT
为了实现最终效果我写的代码:
select
t.[origin-destination],t.[SH/LANE/MOT] /count(*) AS PERCENTAGE
FROM (代码1) t
group by [origin-destination]
having t.[SH/LANE/MOT] /count(*) <= 0.01
这个代码不能运行,或者哪位高手有更简略的写法么
这样:
select
t.[origin-destination],t.[SH/LANE/MOT] /(select count(1) from ['TMS$'] ) AS PERCENTAGE
FROM (代码1) t
group by [origin-destination],t.[SH/LANE/MOT]
having t.[SH/LANE/MOT] /count(*) <= 0.01
注:两个count都是int,相除会没有小数部分,所以应该都给转成带小数的数。
cast as numeric(10,4) 。
扩展资料:
SQL中除法运算的实现
R(X,Y)÷S(Y,Z)的运算用结构化语言SQL 语句可表达为下列形式:
select distinct R.X from R R1
where not exists
(
select S.Y from S
where not exists
(
select * from R R2
where R2.X=R1.X and R2.Y=S.Y
)
)
参考技术ASQL做除法的步骤:
select
t.[origin-destination],t.[SH/LANE/MOT] /(select count(1) from ['TMS$']) AS PERCENTAGEFROM (代码1) t
group by [origin-destination],t.[SH/LANE/MOT]
having t.[SH/LANE/MOT] /count(*) <= 0.01
注:两个count都是int,相除会没有小数部分,所以应该都给转成带小数的数。
cast as numeric(10,4) 。
扩展资料
例题,表明为chuqinqk 列名 迟到 1(次)一个月的总天数为30 求迟到率。
select * from table1 where 工资>2500 and 工资<3000 //同上
select 姓名 from table1 where 性别='0' and 工资='4000'
select * from table1 where not 工资= 3200
select * from table1 order by 工资desc //将工资按照降序排列
select * from table1 order by 工资 asc //将工资按照升序排列
select * from table1 where year(出身日期)=1987 //查询table1 中所有出身在1987的人select * from table1 where name like
'%张' /'%张%' /'张%' //查询1,首位字‘张’3,尾位字‘张’2,模糊查询
select * from table1 order by money desc //查询表1按照工资的降序排列表1 (升序为asc)
select * from table1 where brithday is null //查询表1 中出身日期为空的人
SQL语言,是结构化查询语言(Structured Query Language)的简称。
参考技术B使用分析函数sum() over (partiion by ... )将Origin, Destination相同的SH值计算出来,这样就可以求出百分比值了:
假设代码1整理的结果中Origin, Destination, MOT三个字段不重复,那么可以这样来查询:
select s.*from (
select t.*, t.[SH/LANE/MOT] * 1.0 / ( sum(t.[SH/LANE/MOT]) over (partiton by t.[origin-destination]) ) AS PERCENTAGE
FROM (代码1) t
) s
where s.PERCENTAGE <= 0.01
现在一般最近版本的数据库都有支持分析函数的。如果不支持分析函数,那么就要自己再做一个子查询来统计同origin, destination的sh和,然后计算百分比。
追问我觉得第一行的select s 没有什么用所以把关于S的语句去掉了,但是报错说:
Incorrect syntax near 'partiton'.
Incorrect syntax near 't'.
再把关于S 的语句加回去也还是一样报错,请问是哪里错了呢?
另外问一句,您复制代码怎么复制的是带格式和背景的?
t.[origin-destination],t.[SH/LANE/MOT] /(select count(1) from ['TMS$'] ) AS PERCENTAGE
FROM (代码1) t
group by [origin-destination],t.[SH/LANE/MOT]
having t.[SH/LANE/MOT] /count(*) <= 0.01
应该是这样吧。
还有,两个count都是int,相除会没有小数部分,所以应该都给转成带小数的数。cast as numeric(10,4) 这样的。追问
结果能出来但是,我总觉得最外层不应该再 group by t.[SH/LANE/MOT] ,虽然只有这样才能运行。
因为第一行除法的分母是根据t.[SH/LANE/MOT]分组后的SH 总数(包括所有MOT),
但是语句最后有两个分组条件,这样两个分组条件出来的结果就不是我要的分母了吧?
SQL语句怎么表示除法运算?
参考技术Aselect case when 除数 =0 then 0 else 被除数/除数 end
一. 基本概念
SQL语言,是结构化查询语言(Structured Query Language)的简称。SQL语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
二. 支持标准
SQL 是1986年10 月由美国国家标准局(ANSI)通过的数据库语言美国标准,接着,国际标准化组织(ISO)颁布了SQL正式国际标准。1989年4月,ISO提出了具有完整性特征的SQL89标准,1992年11月又公布了SQL92标准,在此标准中,把数据库分为三个级别:基本集、标准集和完全集。
三. 记录筛选
sql="select * from 数据表 where字段名=字段值 order by字段名[desc]"(按某个字段值降序排列。默认升序ASC)
sql="select * from 数据表 where字段名like '%字段值%' order by 字段名 [desc]"
sql="select top 10 * from 数据表 where字段名=字段值 order by 字段名 [desc]"
sql="select top 10 * from 数据表 order by 字段名 [desc]"
sql="select * from 数据表 where字段名in ('值1','值2','值3')"
sql="select * from 数据表 where字段名between 值1 and 值2"
以上是关于SQL如何做除法的主要内容,如果未能解决你的问题,请参考以下文章