今天寫了一條把我兩個月職業生涯學到的SQL知識全用上了的語句
阿新 • • 發佈:2019-02-11
select r.ENTERPRISE_ID,
e.ENTERPRISE_NAME,
e.ADDR,
e.REPRESENT,
l.LEVEL_NAME,
e.eval_year enterprise_year,
r.eval_year record_year,
sum(DECR_SCORE) as SUM_DECR,
(case
when ((100 - sum(DECR_SCORE)) <= t.alarm_value and
(100 - sum(DECR_SCORE)) > t.warning_value) then
'預警'
when ((100 - sum(DECR_SCORE)) <= t.warning_value) then
'預警'
end) type,
t.warning_value,
t.alarm_value
from eece_credit_record r
inner join eece_enterprise e
on r.enterprise_id = e.enterprise_id
inner join eece_level l
on e.level_id = l.level_id
join eece_set_threshold t
on 1 = 1
where e.eval_year = '2016'
and r.eval_year = '2017'
group by r.ENTERPRISE_ID,
e.ENTERPRISE_NAME,
e.ADDR,
e.REPRESENT,
l.LEVEL_NAME,
e.eval_year,
r.eval_year,
t.warning_value,
t.alarm_value
having (100 - sum(DECR_SCORE)) < t.alarm_value
看起來應該還是比較複雜 一會看看有沒有辦法優化
————————————————————————————————————————————
優化:
<select id="pageCreditWarning" parameterType="com.upsoft.sep.bp.common.entity.RequestPage"
resultMap="creditWarningResultMap">
SELECT
r.enterprise_id,
E.enterprise_name,
E.addr,
E.represent,
l.level_name,
E.eval_year enterprise_year,
r.eval_year record_year,
SUM (decr_score) AS sum_decr_score,
<![CDATA[CASE WHEN ((100 - SUM(decr_score)) <= T.alarm_value AND (100 - SUM(decr_score)) > T.warning_value ) THEN '1' WHEN ((100 - SUM(decr_score)) <= T.warning_value ) THEN '0' END TYPE,]]>
T.warning_value,
T.alarm_value
FROM
eece_credit_record r
INNER JOIN eece_enterprise E ON r.enterprise_id = E.enterprise_id
LEFT JOIN eece_level l ON E.level_id = l.level_id
JOIN eece_set_threshold T ON 1 = 1
WHERE
r.status = '1'
AND E.eval_year = #{param.enterpriseYear,jdbcType=VARCHAR}
AND R.eval_year = #{param.warningYear,jdbcType=VARCHAR}
AND E.EVAL_ORG_PATH like '%${param.evalOrgPath}%'
<if test="param.enterpriseName != null and param.enterpriseName !=''">
and e.ENTERPRISE_NAME like '%${param.enterpriseName}%'
</if>
GROUP BY
r.enterprise_id,
E.enterprise_name,
E.addr,
E.represent,
l.level_name,
E.eval_year,
r.eval_year,
T.warning_value,
T.alarm_value
HAVING
100 - SUM (decr_score) <= T.alarm_value
<if test='param.type == "1"'>
AND 100 - SUM (decr_score) > T.warning_value
</if>
<if test='param.type == "0"'>
AND 100 - SUM (decr_score) < T.warning_value
</if>
</select>