多表查询,join,内联接,substr,字符串连接,to_char,Sysdate,to_date,嵌套查询

本文介绍了一种通过SQL查询来获取研究生导师年龄分布的方法。利用Oracle数据库函数进行数据处理,实现了从不同表中联接数据并计算导师年龄,进而按年龄段进行统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查询目标:研究生指导教师(B表)类型名称DSLBMC、年龄段NLD(C表中出生日期CSRQ格式1960-05-18)
-------------------------------------------------------------------------------------------------------

表:

hl_usr_zxbz.T_ZXBZ_DSLB                 导师类别(类型名称,类型码)              a
hl_usr_gxsj.T_JZG_YJSDSXX       研究生导师信息(类型码, 职工号)          b
hl_usr_GXSJ.T_JZG_JBXX             教职工基本信息(职工号,出生日期)       c

---------------------------------------------------------------------------------------------------
表关系:

a                                                       b                                                      c

类型名称:DSLBMC           

类型码:DSLBDM  -----------> 类型码:DSLBDM 

                                                职工号:ZGH        ----------->     职工号:ZGH

                                                                                                     出生日期:CSRQ

---------------------------------------------------------------------------------------------------

常用语法:

'%'||?||'%':字符串连接

to_char(csrq,'yyyy'):转化日期格式 年、年月yyyy-mm、年月日 yyyy-mm-dd、小时 'hh'、24小时制 'hh24'

Sysdate:当前日期

上个月:Select Sysdate - Interval '1' Month From Dual  或 add_months(Sysdate,-1)to_date(?,'yyyy-mm-dd')
substr(jszw,-1,1)
substr((to_date(substr(?,1,10),'yyyy-mm-dd')-cssj)/365,0,2) as age

In Oracle/PLSQL, the substr functions allows you to extract a substring from a string.
The syntax for the substr function is:
substr( string, start_position, [ length ] )
string is the source string.
start_position is the position for extraction. The first position in the string is always 1.
length is optional. It is the number of characters to extract. If this parameter is omitted, substr will return the entire string.

Note:
If start_position is 0, then substr treats start_position as 1 (ie: the first position in the string).
If start_position is a positive number, then substr starts from the beginning of the string.
If start_position is a negative number, then substr starts from the end of the string and counts backwards.
If length is a negative number, then substr will return a NULL value.

For example:

substr('This is a test', 6, 2) would return 'is'
substr('This is a test', 6) would return 'is a test'
substr('TechOnTheNet', 1, 4) would return 'Tech'
substr('TechOnTheNet', -3, 3) would return 'Net'
substr('TechOnTheNet', -6, 3) would return 'The'
substr('TechOnTheNet', -8, 2) would return 'On'

-----------------------------------------------------------------------------------------------------

先查年龄:                            

Select a.dslbmc,to_char(sysdate,'yyyy')-to_char(c.csrq,'yyyy') As age

From hl_usr_zxbz.T_ZXBZ_DSLB a

Join hl_usr_gxsj.T_JZG_YJSDSXX b On a.dslbdm=b.dslbdm

Join hl_usr_GXSJ.T_JZG_JBXX c On b.zgh=c.zgh


               

----------------------------------

再查年龄段:nld

Select dslbmc,substr(age,1,1)||'0'||'-'||to_char(to_number(substr(age,1,1))+1)||'0' As nld,Count(*) As Count,'0' As flag
From (
Select a.dslbmc,to_char(sysdate,'yyyy')-to_char(c.csrq,'yyyy') As age
From hl_usr_zxbz.T_ZXBZ_DSLB a
Join hl_usr_gxsj.T_JZG_YJSDSXX b On a.dslbdm=b.dslbdm
Join hl_usr_GXSJ.T_JZG_JBXX c On b.zgh=c.zgh
)
Where age Between 20 And 80
Group By dslbmc,substr(age,1,1)

————————————————————————————————

结果:

          DSLBMC            NLD             COUNT      FLAG

1         学术(论文)       20-30              1                0
2         应用(授课)       20-30              1                0
3         应用(授课)       20-30              1                0

作者:汪湘洲

06.10.16

如下SQL需查找并统计年假未休,现报错ORA-00942,请协助修改, 并优化oracle如下SQL性能,提高执行效率减少资源占用: WITH EMP_BASE AS ( SELECT EMP_CODE, EMP_NAME, ANNUAL_LEAVE, YEAR, DECODE(HPB.WORK_PLACE, 0, '一园', 1, '二园', 2, '三园','','NULL', HPB.WORK_PLACE) AS PLANT, HCP.SF_LSHR_NO_GET(EMP_CODE, 14) AS DIV, HCP.SF_LSHR_NO_GET(EMP_CODE, 15) AS DEPT_NAME, HCP.SF_LSHR_NO_GET(EMP_CODE, 13) AS CLASS_NAME, SUBSTR(HCP.SF_LSHR_NO_GET(EMP_CODE, 15), LENGTH(HCP.SF_LSHR_NO_GET(EMP_CODE, 15))-5) AS DEPT_NO, HCP.SF_LSHR_NO_GET(EMP_CODE, 2) AS SEGMENT_NO, HCP.SF_LSHR_NO_GET(EMP_CODE, 9) AS EMAIL_FIELD9, HCP.SF_LSHR_NO_GET(EMP_CODE, 10) AS EMAIL_FIELD10, HCP.SF_LSHR_NO_GET(EMP_CODE, 11) AS EMAIL_FIELD11 FROM HCP.v_clk_tz_annual_leave JOIN HCP.TZ_EMP_IN HPB ON EMP_CODE=HPB.EMPCODE WHERE ANNUAL_LEAVE > 0 AND YEAR = TO_NUMBER(TO_CHAR(SYSDATE, 'yyyy')) AND ((TO_CHAR(SYSDATE, 'mm') IN ('04', '05', '06', '07', '08', '09') AND TRUNC(SYSDATE) IN (SELECT MAX(B.A) FROM (SELECT TRUNC(SYSDATE, 'mm') + ROWNUM - 1 A FROM DBA_OBJECTS WHERE ROWNUM < 32) B WHERE TO_CHAR(B.A, 'day') = 'friday ')) OR (TO_CHAR(SYSDATE, 'mm') IN ('10', '11') AND TO_CHAR(SYSDATE, 'Day') = 'Friday ') OR TO_CHAR(SYSDATE, 'mm') = '12') ), LOOKUP_PREP AS ( SELECT REVERSE2, MEANING, HCP.SF_LSHR_NO_GET(MEANING, 8) AS V_EMAIL FROM HCP.KS_LOOKUP_VALUE WHERE LOOKUP_TYPE = 'DEPT_PEOPLE' AND ENABLED = 'Y' ), DEPT_PEOPLE AS ( SELECT E.EMP_CODE, L.V_EMAIL, ROW_NUMBER() OVER ( PARTITION BY E.EMP_CODE ORDER BY CASE WHEN L.REVERSE2 = E.DEPT_NO THEN 1 ELSE 2 END ) AS rnk FROM EMP_BASE E JOIN LOOKUP_PREP L ON L.REVERSE2 IN (E.DEPT_NO, E.SEGMENT_NO) ), GROUPED_DATA AS ( SELECT E.PLANT, E.DIV, E.DEPT_NAME, E.CLASS_NAME, COUNT(E.EMP_CODE) AS UNPEOPLE, SUM(E.ANNUAL_LEAVE) AS UNDAY, MAX(D.V_EMAIL) || ';' || HCP.SF_LSHR_NO_GET(MAX(E.EMAIL_FIELD9), 8) AS TOEMAIL, HCP.SF_LSHR_NO_GET(MAX(E.EMAIL_FIELD10), 8) || ';' || HCP.SF_LSHR_NO_GET(MAX(E.EMAIL_FIELD11), 8) AS CCEMAIL FROM EMP_BASE E JOIN DEPT_PEOPLE D ON E.EMP_CODE = D.EMP_CODE AND D.rnk = 1 GROUP BY E.PLANT, E.DIV, E.DEPT_NAME, E.CLASS_NAME ) SELECT PLANT 厂区, DIV 处级, DEPT_NAME 部门名称, CLASS_NAME 课别名称, UNPEOPLE 未休人数, UNDAY 未休天数, TOEMAIL, CCEMAIL FROM(SELECT PLANT, DIV, DEPT_NAME, CLASS_NAME, UNPEOPLE, UNDAY, TOEMAIL, CCEMAIL FROM GROUPED_DATA UNION ALL SELECT '合计', '', '', '', COUNT(EMP_CODE), SUM(ANNUAL_LEAVE), '', '' FROM EMP_BASE WHERE ANNUAL_LEAVE > 0) WHERE UNDAY IS NOT NULL ORDER BY PLANT, DIV, DEPT_NAME, CLASS_NAME
最新发布
07-22
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值