首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >T-SQL查询建议

T-SQL查询建议
EN

Stack Overflow用户
提问于 2021-12-10 15:33:46
回答 2查看 64关注 0票数 2
代码语言:javascript
运行
复制
CREATE TABLE #Emp
(
    ID int,
    Name varchar(100)
)

INSERT INTO #Emp 
VALUES (1, 'AAA'), (2, 'BBB'), (3, 'CCC')

CREATE TABLE #Task
(
    EmpID int,
    TaskName varchar(100),
    [Hours] int
)

INSERT INTO #Task 
VALUES (1, 'Task-1', 2), (1, 'Task-2', 4), (1, 'Task-5', 3),
       (2, 'Task-3', 2), (2, 'Task-4', 4), (2, 'Task-5', 3),
       (3, 'Task-1', 2), (3, 'Task-1', 4), (3, 'Task-1', 6),
       (3, 'Task-2', 3), (3, 'Task-6', 1)

#Emp

代码语言:javascript
运行
复制
ID  Name
--------
1   AAA
2   BBB
3   CCC

#任务

代码语言:javascript
运行
复制
EmpID   TaskName    Hours
-------------------------
1       Task-1       2
1       Task-2       4
1       Task-5       3
2       Task-3       2
2       Task-4       4
2       Task-5       8
3       Task-1       2
3       Task-1       4
3       Task-1       6
3       Task-2       3
3       Task-6       1

对于每个员工,我需要得到任务-1和任务-2以及任务-5的小时之和。

如下所示

代码语言:javascript
运行
复制
Name   PrepHours(Task-1 + Task-2)   ReviewHours(Task-5)
-------------------------------------------------------
AAA     6                             3
BBB     0                             8
CCC     15                            0

我尝试了这里显示的查询,但是它失败了,错误列#Task.TaskName在select列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。

代码语言:javascript
运行
复制
SELECT 
    Name, PrepHours, ReviewHours 
FROM 
    #Emp AS E
JOIN
    (SELECT
         empid, 
         CASE 
             WHEN Taskname IN ('Task-1','Task-2') 
                 THEN SUM(Hours) 
                 ELSE 0 
         END AS 'PrepHours',
         CASE 
             WHEN Taskname IN ('Task-5') 
                 THEN SUM(Hours) 
                 ELSE 0 
         END AS 'ReviewHours'
     FROM 
         #Task
     WHERE 
         Taskname IN ('Task-1', 'Task-2', 'Task-5')
     GROUP BY 
         empid) AS t ON E.id = t.empid
ORDER BY
    Name

因此,如果我将Taskname添加到Group by中,它将为每个行提供多个行。我需要每个员工排一排。需要帮助。

代码语言:javascript
运行
复制
Name    PrepHours   ReviewHours
-------------------------------
AAA      2           0
AAA      4           0
AAA      0           3
BBB      0           8
CCC     12           0
CCC      3           0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-10 15:58:08

通过将求和移出case语句,可以使原始查询工作:

代码语言:javascript
运行
复制
SELECT [Name],
       PrepHours,
       ReviewHours
FROM   #Emp AS E
       JOIN (SELECT empid,
                   Sum( CASE
                      WHEN Taskname IN ( 'Task-1', 'Task-2' ) THEN [Hours]
                      ELSE 0
                    END) AS 'PrepHours',
                    sum(CASE
                      WHEN Taskname IN ( 'Task-5' ) THEN [Hours]
                      ELSE 0
                    END) AS 'ReviewHours'
             FROM   #Task
             WHERE  Taskname IN ( 'Task-1', 'Task-2', 'Task-5' )
             GROUP  BY empid) AS t
         ON E.id = t.empid
ORDER  BY Name
票数 2
EN

Stack Overflow用户

发布于 2021-12-10 15:41:58

您可以在交叉应用中使用条件大小写表达式创建总计。

代码语言:javascript
运行
复制
select e.name, t.*
from #emp e
cross apply (
    select 
        Sum(case when taskname in ('task-1','task-2') then hours else 0 end) PrepHours,
        Sum(case when taskname ='Task-5' then hours else 0 end) ReviewHours
    from #task t
    where t.EmpId=e.Id
)t
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70306908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档