MySQL使用用@jznum声明一个变量
2017-12-22 16:15
295 查看
今天写了一个超长的(MySql)SQL语句,为了统计医生的综合名次:
统计名次逻辑:使用到了@jznum声明一个变量
医生有三个名次指标:接诊人数、金额、复诊人数
首先:要得出这三个指标的名次(得出三个排名:接诊人数、金额、复诊人数)
然后:把每个医生的三个名次相加(接诊人数名次+金额名次+复诊人数名次),作为每个医生的“综合名次”。
最后:根据每个医生的“综合名次”,排序,得出前十名。
给出SQL:
SQL很乱!
小结:
知识点 1 :
用@jznum声明一个变量,来根据已经排好序的数据,添加一列新的序号列。
select @jznum:=@jznum+1 as rank, st.xm from
( select * from StudentInfo order by fenshu desc) st, (select @jznum:=0) B order by rank
知识点 2:
在使用sql函数时,尽量不要把函数与表中的字段关联起来,这样的话,这个字段所带的索引就会失效。
例如:上面的SQL语句中所涉及的datediff函数,
用:
CURDATE()>tjrq and DATE_ADD(CURDATE(),INTERVAL -365 DAY)<tjrq
来代替。这样函数和字段脱离,就不会影响字段的索引功能。
统计名次逻辑:使用到了@jznum声明一个变量
医生有三个名次指标:接诊人数、金额、复诊人数
首先:要得出这三个指标的名次(得出三个排名:接诊人数、金额、复诊人数)
然后:把每个医生的三个名次相加(接诊人数名次+金额名次+复诊人数名次),作为每个医生的“综合名次”。
最后:根据每个医生的“综合名次”,排序,得出前十名。
给出SQL:
select je.ysmc,jerank,fzrank,jzrank,@sum:=jerank+fzrank+jzrank as rank from (select @jenum:=@jenum+1 as jerank, t.ysmc from (select ysmc,SUM(je) as sumje from TB_DPSTAT_YSJXJXZH where datediff(curdate(),tjrq)<365 and datediff(curdate(),tjrq)>0 GROUP BY YSgh ORDER BY sumje Desc) t, (select @jenum:=0) B order by t.sumje desc) je, ( SELECT @fznum :=@fznum + 1 AS fzrank, t.ysmc, t.sumfzrs FROM ( SELECT ysmc, SUM(fzrs) AS sumfzrs FROM TB_DPSTAT_YSJXJXZH WHERE datediff(curdate(), tjrq) < 365 AND datediff(curdate(), tjrq) > 0 GROUP BY YSgh ORDER BY sumfzrs DESC ) t, (SELECT @fznum := 0) B ORDER BY t.sumfzrs DESC ) fz, ( SELECT @jznum :=@jznum + 1 AS jzrank, t.ysmc, t.sumrjjzrs FROM ( SELECT ysmc, SUM(RJJZRS) AS sumrjjzrs FROM TB_DPSTAT_YSJXJXZH WHERE datediff(curdate(), tjrq) < 365 AND datediff(curdate(), tjrq) > 0 GROUP BY YSgh ORDER BY sumrjjzrs DESC ) t, (SELECT @jznum := 0) B ORDER BY t.sumrjjzrs DESC ) jz WHERE je.ysmc = fz.ysmc AND fz.ysmc = jz.ysmc ORDER BY rank LIMIT 10
SQL很乱!
小结:
知识点 1 :
用@jznum声明一个变量,来根据已经排好序的数据,添加一列新的序号列。
select @jznum:=@jznum+1 as rank, st.xm from
( select * from StudentInfo order by fenshu desc) st, (select @jznum:=0) B order by rank
知识点 2:
在使用sql函数时,尽量不要把函数与表中的字段关联起来,这样的话,这个字段所带的索引就会失效。
例如:上面的SQL语句中所涉及的datediff函数,
用:
CURDATE()>tjrq and DATE_ADD(CURDATE(),INTERVAL -365 DAY)<tjrq
来代替。这样函数和字段脱离,就不会影响字段的索引功能。
相关文章推荐
- 使用临时表与声明一个表数据类型的变量有什么区别
- 【转】static和extern的区别;当使用另外一个文件中的变量、类、方法时,什么时候改用extern声明,什么时候该include?
- mysql 变量名称的使用不当的一个错误
- Mysql变量声明与使用
- C++编码器军规(003):避免对一个声明为const的变量使用const_cast
- 关于如何使用反射声明一个泛型类型变量(泛型参数是动态的)的问题
- 5章6节局部与全局使用同一个变量不同定义的调用
- 2009年腾讯校园招聘笔试题! 不使用任何中间变量求一个const字符串长度
- 如何声明一个全局变量,可以在应用的任何单元引用
- (转)GeneXus初学者变量的声明和使用
- redhat9下使用mysql乱码的一个原因
- 函数/变量的声明、使用
- MySQL查询所有供应商和其任意一个产品 - Group by的使用
- 一个线程被另一个不相干的线程卡住了 - 不良的使用全局变量的构造函数的习惯
- Mysql:命令选项、配置选项、(全局、会话)系统变量、状态变量:如何使用系统变量?
- 享变量内有一个函数指针,是外部传进来的。 可我一使用这个函数指针,就出错了
- 不使用 if switch 等 求出两个变量中的较大或(较小)的一个 11月13日
- 在mysql 中使用变量
- 使用PHP和MySQL构建一个Dojo Tree控件
- Oracle使用手册(一)---声明变量