SQL如何做除法

上图是我用代码1实现的效果。我想在代码1的基础上实现下图,即先统计每个orgin-destination每个MOT的SH个数占该orgin-destination所有SH... 上图是我用代码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

这个代码不能运行,或者哪位高手有更简略的写法么
展开
 我来答
大野瘦子
高粉答主

2019-08-01 · 繁杂信息太多,你要学会辨别
知道小有建树答主
回答量:1227
采纳率:100%
帮助的人:24.4万
展开全部

这样:

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 

)

帐号已注销
高粉答主

2019-08-25 · 关注我不会让你失望
知道小有建树答主
回答量:1346
采纳率:100%
帮助的人:25.3万
展开全部

SQL做除法的步骤:

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)的简称。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Andy_Sun321
推荐于2017-10-14 · TA获得超过1376个赞
知道小有建树答主
回答量:811
采纳率:89%
帮助的人:664万
展开全部

使用分析函数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 的语句加回去也还是一样报错,请问是哪里错了呢?

另外问一句,您复制代码怎么复制的是带格式和背景的?

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
射手幽灵伊
2015-02-13 · TA获得超过2713个赞
知道大有可为答主
回答量:4955
采纳率:81%
帮助的人:1725万
展开全部
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) 这样的。
追问
结果能出来但是,我总觉得最外层不应该再 group by t.[SH/LANE/MOT] ,虽然只有这样才能运行。
因为第一行除法的分母是根据t.[SH/LANE/MOT]分组后的SH 总数(包括所有MOT),

但是语句最后有两个分组条件,这样两个分组条件出来的结果就不是我要的分母了吧?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式