亲宝软件园·资讯

展开

sql语句中临时表使用实例详解

机智大袁 人气:0

一、临时表实现分步处理

1.概述

当需要的结果需要经过多次处理后才能最终得到我们需要的结果时,就可以使用临时表,这里临时表就起到了一个中间处理的作用,实现了分步处理,简化了问题。

2.实例

2.1表格结构

pln_order_pool_detail(表名)

2.2需求

需要得到订单平均交付周期、最大交付周期、最小交付周期,为了实现这一需求,首先我们要求出每个订单的交付周期,其次我们需要将这些订单的交付周期求其平均值。

2.3sql语句

SELECT
    AVG( leadTime ) avgLeadTime,
    MAX( leadTime ) maxLeadTime,
    MIN( leadTime ) minLeadTime
FROM
    ( SELECT DATEDIFF(reality_deliver_time,create_time) AS leadTime FROM  pln_order_pool  WHERE order_state = 'finish' ) a

2.4sql语句解析

其中 SELECT DATEDIFF(reality_deliver_time,create_time) AS leadTime FROM  pln_order_pool  WHERE order_state = 'finish' 是求出每个订单的交付周期作为临时表,每个订单的交付周期即状态(order_state)为'finish'的订单的实际交付时间(reality_deliver_time)减去该订单的创建时间(create_time)

DATEDIFF(reality_deliver_time,create_time):该函数表示实际交付日期(reality_deliver_time)与创建日期(create_time)的间隔,且结果是以天数进行返回

 AVG( leadTime ):将临时表中的交付周期通过AVG函数求出平均交付周期

MAX( leadTime):将临时表中的交付周期通过MAX函数求出最大交付周期

MIN( leadTime):将临时表中的交付周期通过MIN函数求出最小交付周期

二、临时表实现分层处理

1、概述

在实际开发中经常会碰到一个字段下存储的结果不同,而我又需要对这两个结果进行处理得到最终的结果,此时如果没有临时表我们就可能需要写两个sql语句分别得到结果,然后在后端进行运算得到最终需要的结果。

2、实例

也许上面的概述表述并不清楚,现在用一个实例来说明。

像这样的一个表结构,我想要计算2022年8月9号这一天的计划完成率,那就需要计算该日期的计划数和计划完成数的比值,也就是计算该日期的实出对应的数量与该日期的计划对应的数量的比值,但是上面的表结构中计划与实出都在type一个字段下,我又该如何将where条件设置为type等于“计划”求出计划数,同时又将where条件设置为type等于“实出”求出实际完成的数量呢?

2.1表结构

plan(表名)

2.2需求

求出2022年8月9号一天的计划完成率

2.3sql语句

SELECT
	planNums,
	finishNums,
	IFNULL( ROUND( finishNums / planNums * 100, 2 ), 0 ) finishRate 
FROM
	( SELECT SUM( num ) planNums FROM plan WHERE type = '计划' AND date = '2022-08-09') a,
	( SELECT SUM( num ) finishNums FROM plan WHERE type = '实出' AND date = '2022-08-09') b

2.4sql语句解析

针对上述的问题,我们使用临时表就可以完美的解决,根据条件的不同我们建立两个临时表,分别记录当天的计划总数和当天的实际完成的数量,实现分层处理,最后我们再将临时表中的数据进行运算就可以得到当天的计划完成率。

SELECT SUM( num ) planNums FROM plan WHERE type = '计划' AND date = '2022-08-09'

 此句求出2022年8月9号的计划总数临时表

SELECT SUM( num ) finishNums FROM plan WHERE type = '实出' AND date = '2022-08-09'

此句求出2022年8月9号的实际完成总数临时表

IFNULL(ROUND(finishNums/planNums*100,2),0):此函数用于排除临时表中计划总数为null的情况,若ROUND(finishNums/planNums*100,2)为空,则返回值为0,否则返回值就是ROUND(finishNums/planNums*100,2)

ROUND(finishNums/planNums*100,2):此函数为四舍五入函数,将finishNums/planNums*100计算的结果保留两位小数

注意:临时表一定需要起别名,否则就会报错

加载全部内容

相关教程
猜你喜欢
用户评论