Hailey Zhou 2022-09-28 03:33 采纳率: 60%
浏览 120
已结题

Sql server中如何在case when 里面做除法,分母是另一个sub query

大家好,请大家帮忙一下这一题:

img

第一个表是我现在的数据,第二个表是我想要的结果。我想要加多一列计算这个VM%,这个VM%=Voice Mail 的数量除以这一个组总共接听数。例如Team 1在9/2 号的VM%=3/(22+3), Team 2 在9/2 的VM%=7/(101+7)。以此类推。软件用到是sql server。谢谢!!

  • 写回答

6条回答 默认 最新

  • chuifengde 2022-09-28 08:59
    关注
    --三楼的改一下
    DECLARE @a TABLE([Date] DATE,[Group Name] VARCHAR(50),[Total Answered] INT)
    
    INSERT @a SELECT '9/2/2022','Team 1',22
    UNION ALL SELECT '9/2/2022','Team 1 Voice Mail',3
    UNION ALL SELECT '9/2/2022','Team 2',101
    UNION ALL SELECT '9/2/2022','Team 2 Voice Mail',7
    UNION ALL SELECT '9/6/2022','Team 1',55
    UNION ALL SELECT '9/6/2022','Team 1 Voice Mail',2
    UNION ALL SELECT '9/6/2022','Team 2',100
    UNION ALL SELECT '9/6/2022','Team 2 Voice Mail',3
    
    SELECT
        [Date],
        [Group Name],
        [Total Answered],
        CASE WHEN CHARINDEX('Mail',[Group Name])>0 THEN
        CONVERT(REAL,[Total Answered]) /
        (   SELECT SUM([Total Answered])
            FROM @a 
            WHERE [Date] = t1.[Date] AND [Group Name] LIKE LEFT(t1.[Group Name],6) + '%'
        )
        END 'VM%'
    FROM @a t1;
    
    --result
    2022-09-02    Team 1    22    NULL
    2022-09-02    Team 1 Voice Mail    3    0.12
    2022-09-02    Team 2    101    NULL
    2022-09-02    Team 2 Voice Mail    7    0.06481481
    2022-09-06    Team 1    55    NULL
    2022-09-06    Team 1 Voice Mail    2    0.03508772
    2022-09-06    Team 2    100    NULL
    2022-09-06    Team 2 Voice Mail    3    0.02912621
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • _GX_ 2022-09-28 05:31
    关注
    SELECT
        date AS 'Date',
        group_name AS 'Group Name',
        total_answered AS 'Total Answered',
        CASE WHEN group_name LIKE '%Voice Mail' THEN
        CAST(total_answered AS FLOAT) /
        (
            SELECT SUM(total_answered)
            FROM t AS t2
            WHERE t2.date = t1.date AND t2.group_name LIKE SUBSTR(t1.group_name, 1, 6) || '%'
        )
        END AS 'VM%'
    FROM t AS t1;
    

    img

    评论
  • bingcore 2022-09-28 04:23
    关注

    select *,sum (case when group name='team 1 voice mail' then total answered else null end) over (partition by date,group name)/sum (1) over (partition by date,group name) as vm;

    评论
  • 一起随缘 2022-09-28 08:39
    关注

    其实特别不建议在sql中做处理,效率慢,增加sql复杂度而且不雅观,不易维护。查出结果直接在代码中运算出结果返回更合适

    评论
  • yy64ll826 2022-09-28 20:30
    关注

    我看到正确答案就不写了,那些开窗虽然简单点,但你用不了;
    使用参数得挺适合得

    评论
  • IT技术分享社区 数据库领域优质创作者 2022-09-28 08:44
    关注

    你的Team1 和 Team1 Voice Mail 之间有关系吗?这个很重要哦

    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 10月6日
  • 已采纳回答 9月28日
  • 创建了问题 9月28日

悬赏问题

  • ¥30 计算机网络子网划分路由模拟操作
  • ¥15 MATLAB的画图问题
  • ¥15 c语言用fopen_s成功打开文件之后闪退
  • ¥20 用C++完成,并且运用数组
  • ¥30 求解电力系统潮流计算结果不收敛问题
  • ¥15 某易易盾点选data解析逆向
  • ¥15 系统崩溃,关于订单的处理
  • ¥15 datax-web连接hive为数据源时发生报错,如何解决?
  • ¥15 plink在进行gwas分析时总读取不到表型
  • ¥20 数据结构与c语言的实践内容