• 关于CASE中使用聚合函数时的一点经验


    先不要管以下代码是完成什么功能
    --==片段1==
    select
        case when SUM(isnull(ACTVTY_DURTN,0))>=1 then 1 else SUM(isnull(ACTVTY_DURTN,0)) end as DURTN
    ,OWNR_EMP_ID_NK
    from dbo.ECMS_Activity_DIMN AC
        
        WHERE AC.APPT_STRT_DT_TZ BETWEEN '201208' AND '201209'
        AND AC.actvty_main_type = 'Coaching'    
        AND AC.CURR_RECRD_FLG='Y'
                --===========================
        --错误:Column 'dbo.ECMS_Activity_DIMN.OWNR_EMP_ID_NK' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
       
    --==片段2==
        --无错
        select
        distinct
        CASE WHEN CAST(APPT_STRT_DT_TZ AS TIME(6))<='12:00:00' THEN 'Call_AM' ELSE 'Call_PM' end Call_Period,
        CAST(APPT_STRT_DT_TZ as date) as CallDate,
        OWNR_EMP_ID_NK
    from dbo.ECMS_Activity_DIMN AC
        
        WHERE AC.APPT_STRT_DT_TZ BETWEEN '201208' AND '201209'
        AND AC.ACTVTY_MAIN_TYPE='Professional Call' AND AC.ACTVTY_SUBTYPE_CALL in(N'完整拜访',N'简短拜访')
        AND AC.CURR_RECRD_FLG='Y' and AC.ACTVTY_STS_CD='Submit'
     
    片段1为什么会报错,百思不得其解。检查语法正常,一执行就提示错误。按提示加 GROUP BY OWNR_EMP_ID_NK 后,确实无错了,为什么呢
    问了一朋友后得到如下答案:
     
    你case里面用聚合函数,需要制定group by,要么就都用聚合函数
    不能有的用聚合,有的不用聚合,还没有group by
    一般也不会吧聚合函数放在case中
    确实是我在片段1的CASE中使用了SUM聚合函数而片段2中没有。
    按照上面这段话,我故意修改片段1 中OWNR_EMP_ID_NK为MAX(OWNR_EMP_ID_NK) ,执行也没错了
     
     
    朋友看了我的片段1说很不理想,然后写出如下片段
    --3优化的写法
        DECLARE @DurtnSum DECIMAL;
    SELECT @DurtnSum = SUM(COALESCE(ACTVTY_DURTN,0)) FROM dbo.ECMS_Activity_DIMN AC
    WHERE AC.APPT_STRT_DT_TZ BETWEEN '201208' AND '201209'
    AND AC.actvty_main_type = 'Coaching'
    AND AC.CURR_RECRD_FLG = 'Y'
    IF @DurtnSum > 1 OR @DurtnSum = 1
    BEGIN
        SET @DurtnSum = 1
    END
    SELECT @DurtnSum AS DURTN ,
    OWNR_EMP_ID_NK
    FROM dbo.ECMS_Activity_DIMN AC
    WHERE AC.APPT_STRT_DT_TZ BETWEEN '201208' AND '201209'
    AND AC.actvty_main_type = 'Coaching'
    AND AC.CURR_RECRD_FLG = 'Y'

    最后说说这段代码是做什么的:
     
    一天开一个会算0.5个单位,一天里可以开N个会,但一天最多计1个单位,返回每个人每天的单位
     
  • 相关阅读:
    EggJs+Vue服务端渲染实践
    使用Charles代理功能将网络请求定向至本地文件
    iOS内存管理(一)
    RumTime实践之--UITableView和UICollectionView缺省页的实现
    CollectionView水平和竖直瀑布流的实现
    解决在HTTPS页面里嵌套HTTP页面浏览器block的问题
    利用servlet做转发,实现js跨域解决同源问题
    js将数字转换成大写的人民币表达式
    《将博客搬至CSDN》 分类: 勉励自己 2014-09-05 14:29 43人阅读 评论(0) 收藏
    jquery插件,美化select标签
  • 原文地址:https://www.cnblogs.com/net515/p/2716658.html
Copyright © 2020-2023  润新知