MySQL使用用@jznum声明一个变量

来源:互联网 发布:linux socket bind 编辑:程序博客网 时间:2024/06/05 00:16

今天写了一个超长的(MySql)SQL语句,为了统计医生的综合名次:

统计名次逻辑:使用到了@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.sumfzrsFROM(SELECTysmc,SUM(fzrs) AS sumfzrsFROMTB_DPSTAT_YSJXJXZHWHEREdatediff(curdate(), tjrq) < 365AND datediff(curdate(), tjrq) > 0GROUP BYYSghORDER BYsumfzrs DESC) t,(SELECT @fznum := 0) BORDER BYt.sumfzrs DESC) fz, (SELECT@jznum :=@jznum + 1 AS jzrank,t.ysmc,t.sumrjjzrsFROM(SELECTysmc,SUM(RJJZRS) AS sumrjjzrsFROMTB_DPSTAT_YSJXJXZHWHEREdatediff(curdate(), tjrq) < 365AND datediff(curdate(), tjrq) > 0GROUP BYYSghORDER BYsumrjjzrs DESC) t,(SELECT @jznum := 0) BORDER BYt.sumrjjzrs DESC) jzWHEREje.ysmc = fz.ysmcAND fz.ysmc = jz.ysmcORDER BYrankLIMIT 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 
来代替。这样函数和字段脱离,就不会影响字段的索引功能。



原创粉丝点击