比较值得学习的sql语句_decode,to_char,TO_CHAR(sysdate,'MM'),(t.end_date,'HH24')>=21

本文介绍了一个复杂的SQL查询案例,该查询涉及多个表的联接操作、子查询、分组及条件筛选等高级特性,用于从数据库中提取特定时间段内加班记录的详细信息,并对数据进行汇总。

select t1.*,t2.start_date,t2.status from(

select e.user_id,e.emp_name,o.name,count(*) from t_app_work_extra t

left join m_employee e on t.proposer=e.user_id left join m_organization o on e.dept_id=o.org_id

where to_char(t.end_date,'HH24')>=21 andto_char(t.start_date,'yyyy-MM-dd')>='2011-11-26' and to_char(t.end_date,'yyyy-MM-dd')<='2012-01-25' group by e.user_id,e.emp_name,o.name)    t1

left join(

select e.user_id,t.start_date,decode(t.status,'C','审批通过','P','审批中','N','未提交','D','审批未通过')as status,

count(*) from t_app_work_extra t left join m_employee e on t.proposer=e.user_id left join m_organization o on e.dept_id=o.org_id

where to_char(t.end_date,'HH24')>=21 and to_char(t.start_date,'yyyy-MM-dd')>='2011-11-26' and to_char(t.end_date,'yyyy-MM-dd')<='2012-01-25' group by e.user_id,t.start_date,t.status

) t2 on t1.user_id=t2.user_id


SELECT count(*),
  E.EMP_NAME,
  M.name
from M_EMPLOYEE E
left join M_ORGANIZATION M on M.ORG_ID                    =E.DEPT_ID
left join T_ECM_BIRTH_BLESS t on T.TO_USER=E.USER_ID  

WHERE TO_CHAR(E.BIRTHDAY,'MM')>=TO_CHAR(sysdate,'MM')group by E.EMP_NAME

如下SQL需查找刷卡卡点资料,刷卡时间在排班时间规定的上班时间点和下班时间点和加班时间点加1分钟范围内,WP_TYPE(1:上班,2:下班),IS_NEXT_DAY(1:次日卡)请协助修改, 并优化oracle如下SQL性能,提高执行效率和减少资源占用: WITH work_s AS( SELECT A.EMP_CODE,A.EMPNAME,A.WORK_DATE,B.WS_NUMBER,B.WS_SIMPLE_NAME,C.BTW_TIME_TOTAL,C.LAST_TIME_TOTAL,C.Last_start_time,C.last_end_time, case when D.WP_TYPE=2 AND D.IS_NEXT_DAY=1 then TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||''||to_char(D.POINT_TIME,'hh24:mi:ss'))+ 1 ELSE TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||''||to_char(D.POINT_TIME,'hh24:mi:ss')) end POINT_TIME, D.ADV_TIME,D.OVER_TIME,D.WP_TYPE,D.IS_NEXT_DAY, case when D.WP_TYPE=2 AND D.IS_NEXT_DAY=1 then CASE WHEN B.WS_NUMBER='035A' OR B.WS_NUMBER='035B' THEN TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||''||to_char(D.POINT_TIME,'hh24:mi:ss'))+ 1 +C.LAST_TIME_TOTAL/24/60+1.5/24 ELSE TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||''||to_char(D.POINT_TIME,'hh24:mi:ss'))+ 1 +C.LAST_TIME_TOTAL/24/60+2/24 END when D.WP_TYPE=2 then CASE WHEN B.WS_NUMBER='035A' OR B.WS_NUMBER='035B' THEN TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||''||to_char(D.POINT_TIME,'hh24:mi:ss'))+C.LAST_TIME_TOTAL/24/60+1.5/24 WHEN B.WS_NUMBER='005A' THEN TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||''||to_char(D.POINT_TIME,'hh24:mi:ss')) +C.LAST_TIME_TOTAL/24/60+1/24 ELSE TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||''||to_char(D.POINT_TIME,'hh24:mi:ss'))+C.LAST_TIME_TOTAL/24/60+2/24 END end OVERPOINT_TIME, CASE when D.WP_TYPE=2 then CASE WHEN B.WS_NUMBER='005A' THEN TO_TIMESTAMP(to_char(A.WORK_DATE,'yyyy/mm/dd')||''||to_char(D.POINT_TIME,'hh24:mi:ss')) +C.LAST_TIME_TOTAL/24/60+2/24+2/24 END end OVERPOINT_TIME2 FROM HCP.v_clk_tz_emp_workday_info A JOIN HCP.v_clk_work_shift B ON A.WS_ID=B.ID JOIN HCP.v_clk_work_block C ON A.WS_ID = C.WS_ID JOIN HCP.v_clk_work_point D ON C.ID = D.WB_ID WHERE A.WORK_DATE= trunc(SYSDATE-1) ), attendance_data AS ( SELECT DECODE(HPB.WORK_PLACE, 0, 'LSP1', 1, 'LSP2', 2, 'LSP3', HPB.WORK_PLACE) AS MASTER_NO, DECODE(HPB.WORK_PLACE, 0, '一园', 1, '二园', 2, '三园', HPB.WORK_PLACE) AS WORK_PLACE, HPB.EMPCODE, HPB.EMPNAME, FF.FGT02, FF.FGT08, SUBSTR(FF.FGT08,3,1) AS card_type, HPB.RANK_NAME, HPB.ORG_NAME, DECODE(H.SALARY_TYPE,1,'月薪',2,'计时',3,'计件',H.SALARY_TYPE) AS SALARY_TYPE FROM FINGER5.FGT_FILE FF JOIN HCP.TZ_EMP_IN HPB ON FF.FGT10 = HPB.EMPCODE JOIN HCP.v_clk_tz_employee H ON FF.FGT10 = H.EMPCODE JOIN work_s A ON A.EMP_CODE=FF.FGT10 WHERE FF.FGT02 >= trunc(SYSDATE-1) AND FF.FGT02 < trunc(SYSDATE-1) + 1 -- 昨天全天范围 AND FF.FGT03 <> '4' -- 排除无效打卡 AND LENGTH(FF.FGT08) = 5 AND SUBSTR(FF.FGT08,3,1) IN ('1','2') -- 只考虑上班卡和下班卡 AND ( (SUBSTR(FF.FGT08,3,1) = '1' -- 上班卡 AND A.WP_TYPE=1 AND FF.FGT02 >= A.POINT_TIME AND FF.FGT02 < A.POINT_TIME + INTERVAL '1' MINUTE ) OR (SUBSTR(FF.FGT08,3,1) = '2' -- 下班卡 AND A.WP_TYPE=2 AND (CASE WHEN H.SALARY_TYPE=1 AND FF.FGT02 >= A.POINT_TIME AND FF.FGT02 < A.POINT_TIME + INTERVAL '1' MINUTE THEN 1 WHEN A.WS_NUMBER='005A' AND ((FF.FGT02 >= A.POINT_TIME AND FF.FGT02 < A.POINT_TIME + INTERVAL '1' MINUTE) OR (FF.FGT02 >= A.OVERPOINT_TIME AND FF.FGT02 < A.OVERPOINT_TIME + INTERVAL '1' MINUTE) OR (FF.FGT02 >= A.OVERPOINT_TIME2 AND FF.FGT02 < A.OVERPOINT_TIME2 + INTERVAL '1' MINUTE)) THEN 1 WHEN (FF.FGT02 >= A.POINT_TIME AND FF.FGT02 < A.POINT_TIME + INTERVAL '1' MINUTE) OR (FF.FGT02 >= A.OVERPOINT_TIME AND FF.FGT02 < A.OVERPOINT_TIME + INTERVAL '1' MINUTE) THEN 1 END)=1 ) ) ), attendance_filtered AS ( SELECT MASTER_NO, WORK_PLACE, EMPCODE, EMPNAME, FGT02, FGT08, card_type, DECODE(card_type, '1', '上班卡', '2', '下班卡') AS status, RANK_NAME, ORG_NAME, ROW_NUMBER() OVER ( PARTITION BY EMPCODE, card_type ORDER BY FGT02 ASC ) AS rank -- 按员工和打卡类型分区,取最早记录 FROM attendance_data ), tz_opr AS ( SELECT KLV.MEANING, KLV.DESCRIPTION, KLV.REVERSE2, KLV.REVERSE1, KLV.REVERSE3 IP, KLV.REVERSE4 FROM HCP.KS_LOOKUP_VALUE KLV WHERE KLV.LOOKUP_TYPE = 'KQ_SEPARATE_MACHINE' AND KLV.ENABLED = 'Y' ) SELECT MASTER_NO, WORK_PLACE AS MASTER_NAME, EMPCODE AS ID_NO_SZ, EMPNAME AS NAME_SZ, FGT02 AS RECORDTIME, FGT08 AS MACHINE_NO, trunc(SYSDATE-1) AS CDAY, -- 修改为TRUNC确保纯日期输出 A.REVERSE4 AS MACHINE_LOC, status AS SHIFTTYPE, RANK_NAME AS TITLE_NO, HCP.SF_LSHR_NO_GET(EMPCODE, 18) AS TITLE_NAME, HCP.SF_LSHR_NO_GET(EMPCODE, 2) AS SEGMENT_NO, HCP.SF_LSHR_NO_GET(EMPCODE, 13) AS SEGMENT_NAME, SUBSTR(HCP.SF_LSHR_NO_GET(EMPCODE, 15), LENGTH(HCP.SF_LSHR_NO_GET(EMPCODE, 15))-5) AS DEPT_NO, -- 取后6位 HCP.SF_LSHR_NO_GET(EMPCODE, 15) AS DEPT_NAME, HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(EMPCODE, 9), 8) AS TOEMAIL, HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(EMPCODE, 10), 8) || ';' || HCP.SF_LSHR_NO_GET(HCP.SF_LSHR_NO_GET(EMPCODE, 11), 8) AS CCEMAIL, '' AS TEMP_COMPANY FROM attendance_filtered JOIN tz_opr A ON FGT08 = A.MEANING WHERE rank = 1 -- 取每个员工每个打卡类型的最早记录 ORDER BY status, FGT02; -- 按打卡类型和时间排序
07-30
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.foresealife.newglschannel.grp.dao.EsalesInterfaceDao"> <select id="getSalaryConfirmStatus" parameterType="com.foresealife.newglschannel.grp.domain.EsalesRequestDomain" resultType="com.foresealife.newglschannel.grp.domain.EsalesSalaryStatusDomain"> select nvl(max(tp.confirmStatus), '-2') confirmStatus from (select case when a.salary_sum = 0 then '-1' else (select decode(count(1), 0, '-2', decode(max(t.confirm_date), null, '-1', '0')) from t_grp_commision_pay t where t.agent_id = b.grp_agt_id and t.ym = #{period}) end confirmStatus from t_monthly_salary_detail a, t_grp_agt_base b where a.salary_date = to_date(#{period}, 'yyyymm') and a.salary_code = '1003005' and a.agent_code = #{agentCode} and b.grp_agt_code = a.agent_code) tp </select> <!--更新薪资确认时间 --> <update id="updateSalaryConfirmDate" parameterType="com.foresealife.newglschannel.grp.domain.EsalesRequestDomain"> update t_grp_commision_pay t set t.confirm_date = sysdate where t.agent_id = (select a.grp_agt_id from t_grp_agt_base a where a.grp_agt_code = #{agentCode}) and t.ym = #{period} </update> <select id="getLastSalaryConfirmMonth" parameterType="java.lang.String" resultType="java.lang.String"> select max(t.ym) ym from t_grp_commision_pay t, t_grp_agt_base t1 where t.confirm_date is not null and t1.grp_agt_id = t.agent_id and t1.grp_agt_code = #{agentCode} </select> <!-- 获取考勤日期当天所有异常考勤信息 --> <select id="getEsalesAbnormalAttList" parameterType="java.lang.String" resultType="com.foresealife.newglschannel.grp.domain.EsalesAbnormalAttDomain"> select a.agent_code agentCode, c.description attendanceDesp, to_char(a.start_time, 'yyyy-mm-dd hh24:mi:ss') startTime, to_char(a.end_time, 'yyyy-mm-dd hh24:mi:ss') endTime, #{checkDate} checkDate from t_attendance_daily_result a, t_grp_agt_base b, t_attendance_type c where a.agent_code = b.grp_agt_code and b.agent_status = '1' and a.need_attend = 'Y' and a.attendance_type in ('02', '03', '04', '06', '07', '08', '09', '10') and a.check_date = to_date(#{checkDate}, 'yyyy-mm-dd') and c.attendance_type = a.attendance_type </select> <parameterMap id="commRate.parameterMap" class="map"> <parameter property="commRate" jdbcType="VARCHAR" javaType="java.lang.String" mode="OUT" /> <parameter property="channelType" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN" /> <parameter property="salaryDate" jdbcType="DATE" javaType="java.util.Date" mode="IN" /> <parameter property="premiumYear" jdbcType="NUMBER" javaType="java.lang.Integer" mode="IN" /> <parameter property="policyYear" jdbcType="NUMBER" javaType="java.lang.Integer" mode="IN" /> <parameter property="policyId" jdbcType="NUMBER" javaType="java.lang.Integer" mode="IN" /> <parameter property="productId" jdbcType="NUMBER" javaType="java.lang.Integer" mode="IN" /> </parameterMap> <!--获取提奖比例信息 --> <procedure id="getCommRateInfoList" parameterMap="commRate.parameterMap"> { ?=call pkg_grp_salary_package.func_get_comm_rate(?,?,?,?,?,0,0)} </procedure> </mapper>有什么问题吗
最新发布
09-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值