【问题标题】:Conditionally Summing the same Column multiple times in a single select statement?在单个选择语句中多次有条件地对同一列求和?
【发布时间】:2011-02-13 13:43:25
【问题描述】:

我有一个表格,显示每个月在给定位置的各种部署类型的员工部署:

ID | Location_ID | Date | NumEmployees | DeploymentType_ID

例如,一些记录可能是:

 1 | L1 | 12/2010 | 7 | 1 (=Permanent)
 2 | L1 | 12/2010 | 2 | 2 (=Temp)
 3 | L1 | 12/2010 | 1 | 3 (=Support)
 4 | L1 | 01/2011 | 4 | 1
 5 | L1 | 01/2011 | 2 | 2
 6 | L1 | 01/2011 | 1 | 3
 7 | L2 | 12/2010 | 6 | 1
 8 | L2 | 01/2011 | 6 | 1
 9 | L2 | 12/2010 | 3 | 2

我需要做的是按日期对各种类型的人求和,结果如下所示:

Date    | Total Perm | Total Temp | Total Supp
12/2010 |     13     |     5      |      1
01/2011 |     10     |     2      |      1

目前,我为每种部署类型创建了一个单独的查询,如下所示:

SELECT Date, SUM(NumEmployees) AS "Total Permanent"
FROM tblDeployment
WHERE DeploymentType_ID=1
GROUP BY Date;

我们将该查询称为 qSumPermDeployments。然后,我使用了几个连接来组合查询:

SELECT qSumPermDeployments.Date, qSumPermDeployments.["Total Permanent"] AS "Permanent"
    qSumTempDeployments.["Total Temp"] AS "Temp"
    qSumSupportDeployments.["Total Support"] AS Support
FROM (qSumPermDeployments LEFT JOIN qSumTempDeployments 
    ON qSumPermDeployments.Date = qSumTempDeployments.Date) 
LEFT JOIN qSumSupportDeployments 
    ON qSumPermDeployments.Date = qSumSupportDeployments.Date;

请注意,我目前正在构建最终查询,假设一个位置只有临时员工或支持员工,如果他们也有永久员工。因此,我可以使用永久员工结果作为基表来创建连接。鉴于我目前拥有的所有数据,该假设成立,但理想情况下我想摆脱该假设。

最后,我的问题。有没有办法将其简化为单个查询,或者最好将其分成多个查询 - 如果没有其他原因,可读性。

【问题讨论】:

    标签: sql ms-access select


    【解决方案1】:

    试试这个:

    SELECT
        Date,
        SUM(CASE WHEN DeploymentType_ID=1 THEN NumEmployees ELSE 0 END) AS "Total Permanent",
        SUM(CASE WHEN DeploymentType_ID=2 THEN NumEmployees ELSE 0 END) AS "Total Temporary",
        SUM(CASE WHEN DeploymentType_ID=3 THEN NumEmployees ELSE 0 END) AS "Total Support"
    FROM tblDeployment
    GROUP BY Date;
    

    【讨论】:

      【解决方案2】:
      SELECT Date, 
          SUM(case when DeploymentType_ID = 1 then NumEmployees else null end) AS "Total Permanent", 
          SUM(case when DeploymentType_ID = 2 then NumEmployees else null end) AS "Total Temp", 
          SUM(case when DeploymentType_ID = 3 then NumEmployees else null end) AS "Total Supp"
      FROM tblDeployment
      GROUP BY Date
      

      【讨论】:

      • +1:这次只落后你 11 秒……我越来越近了。 :)
      • 哇!我真的走了很长的路。感谢您的帮助。
      • 感谢您从 2017 年开始!比我预期的要容易得多。
      猜你喜欢
      • 2021-01-05
      • 2013-04-23
      • 2012-06-27
      • 1970-01-01
      • 2014-01-09
      • 2022-01-27
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多