接上一个问题继续提问,sql问题,求助大佬

有3张表

TaskTypes (TaskTypeID,TaskTypeName) -任务类型表

Tasks (TaskID,TaskTypeID,TaskName)-任务表

TaskRecords(TaskRecordID,TaskID,DateTime,Time,UserName)-任务内容记录表,记录每项内容每天的耗时,Time字段为耗时

需求:一句sql语句查询从5月1日到5月30日,某个用户的TaskTypeName,TaskName,每项TaskName的总耗时,以及每项TaskName的总耗时占该用户所有任务总耗时的百分比。

按如下SQL写,发现不指定用户时,查出来每个用户5月份的所有任务总耗时不对,变成了所有用户5月份的总耗时,该如何修改?

WITH TaskDuration AS (      SELECT          t.TaskTypeID,          t.TaskName,          SUM(tr.Time) AS TotalTime      FROM          Tasks t      INNER JOIN          TaskRecords tr ON t.TaskID = tr.TaskID      WHERE          tr.UserName = '指定的用户名'  -- 替换为您的用户名          AND tr.DateTime BETWEEN '2023-05-01' AND '2023-05-30'      GROUP BY          t.TaskTypeID,          t.TaskName   ),   TotalDuration AS (      SELECT          SUM(TotalTime) AS GrandTotalTime      FROM          TaskDuration   )   SELECT      td.TaskTypeID,      tt.TaskTypeName,      td.TaskName,      td.TotalTime,      td.TotalTime * 100.0 / td2.GrandTotalTime AS Percentage   FROM      TaskDuration td   INNER JOIN      TaskTypes tt ON td.TaskTypeID = tt.TaskTypeID   CROSS JOIN      TotalDuration td2;

企业微信截图_17174947824330.png

SQL 被迫营业的小白 发布于 2024-6-4 17:01 (编辑于 2024-6-4 17:55)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共1回答
最佳回答
0
用户k6280494Lv6专家互助
发布于2024-6-4 17:10

这样不行么?

WITH TaskDuration AS (  

    SELECT  

tr.UserName,

        t.TaskTypeID,  

        t.TaskName,  

        SUM(tr.Time) AS TotalTime  

    FROM  

        Tasks t  

    INNER JOIN  

        TaskRecords tr ON t.TaskID = tr.TaskID  

    WHERE  

        

         tr.DateTime BETWEEN '2023-05-01' AND '2023-05-30'  

    GROUP BY  

tr.UserName,

        t.TaskTypeID,  

        t.TaskName  

),  

TotalDuration AS (  

    SELECT  

        SUM(TotalTime) AS GrandTotalTime  

    FROM  

        TaskDuration  

)  

SELECT  

    td.UserName

    td.TaskTypeID,  

    tt.TaskTypeName,  

    td.TaskName,  

    td.TotalTime,  

    td.TotalTime * 100.0 / td2.GrandTotalTime AS Percentage  

FROM  

    TaskDuration td  

INNER JOIN  

    TaskTypes tt ON td.TaskTypeID = tt.TaskTypeID  

CROSS JOIN  

    TotalDuration td2;

  • 被迫营业的小白 被迫营业的小白(提问者) 不行,光给月份,不给用户的情况下(查询所有用户5月份数据),查询出来的A用户A任务的时间占比是 : A用户A任务总耗时/所有用户所有任务的总耗时。我在最后一个select语句里加了个td2.GrandTotalTime,输出结果2万多小时
    2024-06-04 17:35 
  • 用户k6280494 用户k6280494 回复 被迫营业的小白(提问者) 应该会按tr.UserName, t.TaskTypeID, t.TaskName 分组统计的啊
    2024-06-04 17:39 
  • 被迫营业的小白 被迫营业的小白(提问者) 回复 用户k6280494 查询结果这样的 EmployeeName TaskTypeID TaskTypeName TaskTitle TotalTime Percentage GrandTotalTime A A 临时工作 测试 2.00 0.007118 28096.00
    2024-06-04 17:50 
  • 被迫营业的小白 被迫营业的小白(提问者) 回复 用户k6280494 我补充了sql查询截图,大佬帮瞅瞅
    2024-06-04 17:55 
  • 用户k6280494 用户k6280494 回复 被迫营业的小白(提问者) TotalDuration AS ( SELECT SUM(TotalTime) AS GrandTotalTime FROM TaskDuration GROUP BY UserName ) 把这段改成这样试试
    2024-06-04 18:00 
  • 2关注人数
  • 171浏览人数
  • 最后回答于:2024-6-4 17:55
    请选择关闭问题的原因
    确定 取消
    返回顶部