Sql 按特定列中的条件求和

Sql 按特定列中的条件求和,sql,sql-server,Sql,Sql Server,我对SQL Server查询SUM有疑问 我有两张桌子: 1 EmployeesAtt EId,EName,Stats->我有一些统计标准0=迟到,1=加班,2=正常 ----------------------------- | EId | EName | Stats | ----------------------------- | 1 | John | 0 | |---------------------------|

我对SQL Server查询SUM有疑问

我有两张桌子:

1 EmployeesAtt EId,EName,Stats->我有一些统计标准0=迟到,1=加班,2=正常

   -----------------------------
   |  EId  |  EName  |  Stats  |
   -----------------------------
   |   1   |  John   |   0     |
   |---------------------------|
   |   1   |  John   |   1     |
   |---------------------------|   
   |   1   |  John   |   0     |
   |---------------------------|
   |   2   |  Lynda  |   2     |
   -----------------------------
2个AttLogs ID、EId、迟到、加班、正常

从EmployeesAtt表中,我想对AttLogs中专用列中的EId和统计数据求和,如下所示:

   --------------------------------------------------
   |  ID   |   EId   |   late  |  overtime | Normal |
   --------------------------------------------------
   |   0   |  John   |   2     |     1     |    0   |
   |------------------------------------------------|
   |   1   |  Lynda  |   0     |     0     |    1   |
   --------------------------------------------------
这就是我到目前为止所做的:

select EA.EId, EA.EName, late = case when Stats = 0 then SUM(Stats) END, 
overtime = case when Stats = 1 then SUM(Stats) END,
normal = case when Stats = 2 then SUM(Stats) END
From EmployeesAtt EA JOIN AttLogs AL ON AL.EId = EA.EId
GROUP BY EA.EId, EA.EName, EA.Stats

但是结果并不像我在上面预期的那样。

您需要使用条件聚合和对案例表达式求和/计数:

SELECT
    ea.EId,
    ea.EName,
    COUNT(CASE WHEN Stats = 0 THEN 1 END) AS late, 
    COUNT(CASE WHEN Stats = 1 THEN 1 END) AS overtime, 
    COUNT(CASE WHEN Stats = 2 THEN 1 END) AS normal
FROM EmployeesAtt ea
INNER JOIN AttLogs al
    ON al.EId = ea.EId
GROUP BY
    ea.EId,
    ea.EName;
最大限度地利用sql server中的iif函数


谢谢你的快速回复@Tim Biegeleisen,我会立即尝试,我会尽快告诉你它是否有效。谢谢你的查询@Tim Biegeleisen,它完全符合我的要求。你真的帮了我,谢谢你!
select EA.EId
    , EA.EName
    , late = sum(iif(Stats=0, 1, 0))
    , overtime = sum(iif(Stats=0, 1, 0))
    , normal = sum(iif(Stats=0, 1, 0))
From EmployeesAtt EA 
JOIN AttLogs AL ON AL.EId = EA.EId
GROUP BY EA.EId, EA.EName