sql求解mysql中的max 跟case when联合

sql如下

MAX(CASE repaymentStatus WHEN '20' THEN urgeNum ELSE 0 END ) urgeSuccessNum,

这个max我感觉一点用没有 各位有用吗。

select sts.cusServerId,sts.name,sts.urgeTeamName,sum(sts.urgeNum) urgeNum,
        MAX(CASE Status WHEN '20' THEN urgeNum ELSE 0 END ) urgeSuccessNum,
        MAX(CASE Status WHEN '20' THEN urgeSuccessAmount ELSE 0 END ) urgeSuccessAmount,
        MAX(CASE repaymentStatus WHEN '20' THEN urgeNum ELSE 0 END )/sum(sts.urgeNum) urgeSuccessRate
        from (
        select  a.col_admin_id cusServerId,f.roleid urgeTeamName,a.col_admin_name name,count(1) urgeNum,
        a.repayment_status repaymentStatus,sum(a.already_repayment_amount)  urgeSuccessAmount
        from t_loan_apply_record a  left join t_uac_user f on a.col_admin_id = f.id
        where  exists (select 1 from t_loan_col_record b where a.id = b.apply_id)

        <if test='dateTo!=null and dateTo!=""'>
            AND a.release_time  <![CDATA[<= #{dateTo} ]]>
        </if>

        group by a.col_admin_id,repayment_status
        ) sts group by sts.cusServerId

6个回答

是否有更优的解决效果不谈,就本身sql来讲,是有用的。
MAX(CASE Status WHEN '20' THEN urgeNum ELSE 0 END ) urgeSuccessNum,
理解为如果 Status为20,那么效果等同于MAX(urgeNum)结果为urgeNum的最大值,否则计算MAX(0),结果为0

我的理解是,这条sql语句对cusServerId去重了,并且当status值为20查出了usgeNum的最大值,至于目的要结合具体场景看

max获取 CASE Status WHEN '20' 之中的最大值

这句话的意思是,如果字段repaymentStatus的值为20则计算urgeNum这一列的最大值,否则计算0这一列的最大值,也就是否则情况下,不计算最大值,注意case when他在里面决定了计算那一列,仔细看就会发现2种情况计算的列不一样,所以此max必须要,若去除则程序必然达不到预期结果!

zhangpan_soft
zhangpan_soft 回复StackTc: 就是有很多值所以计算很多值得最大值啊!,0 你可以任务是一个别名列,就比如你表中没有1这个列但是依然可以count(1)一样,0只是一个虚拟列,可以认为是表中多加了一列,这一列的值全是0,所以max(0)=0,不懂再问!
大约一年之前 回复
StackTc
StackTc 你确定吗 urgeNum可以是列 下面可能有很多值,但是 0算什么列
大约一年之前 回复

去数据库测试一下就好了啊

select A.cusServerId,A.name,A.urgeTeamName,A.urgeNum,MAX(A.urgeSuccessNum),MAX(A.urgeSuccessAmount),MAX(A.urgeSuccessRate)/A.urgeNum
from(
select sts.cusServerId,sts.name,sts.urgeTeamName,sum(sts.urgeNum) urgeNum,
CASE Status WHEN '20' THEN urgeNum ELSE 0 END as urgeSuccessNum,
CASE Status WHEN '20' THEN urgeSuccessAmount ELSE 0 END as urgeSuccessAmount,
CASE repaymentStatus WHEN '20' THEN urgeNum ELSE 0 END as urgeSuccessRate
from (
select a.col_admin_id cusServerId,f.roleid urgeTeamName,a.col_admin_name name,count(1) urgeNum,
a.repayment_status repaymentStatus,sum(a.already_repayment_amount) urgeSuccessAmount
from t_loan_apply_record a left join t_uac_user f on a.col_admin_id = f.id
where exists (select 1 from t_loan_col_record b where a.id = b.apply_id)

        AND a.release_time  

    group by a.col_admin_id,repayment_status
    ) sts group by sts.cusServerId
    ) A group by A.cusServerId,A.name,A.urgeTeamName,A.urgeNum

干嘛不这么写呢

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!