代码之家  ›  专栏  ›  技术社区  ›  JF-Mechs

如何用多个聚合格式化结果集?

  •  0
  • JF-Mechs  · 技术社区  · 6 年前

    鉴于我有下表:

    +--------+------------+------+--------+
    | Amount |    Date    | Type | UserId |
    +--------+------------+------+--------+
    |      8 | 2018-08-10 | VL   |     11 |
    |      8 | 2018-08-11 | VL   |     11 |
    |      8 | 2018-08-12 | VL   |     11 |
    |      4 | 2018-08-09 | EL   |      9 |
    |      8 | 2018-08-10 | SL   |      9 |
    +--------+------------+------+--------+
    

    如何格式化结果集以获得相同类型的金额之和? 以及所有过去记录(日期>当前日期)的总和。

    像这样的:

     +------+---------------------+----------------+
    | Type | TotalScheduledLeave | TotalLeaveUsed |
    +------+---------------------+----------------+
    | VL   |                  24 |              0 |
    | VL   |                  24 |              0 |
    | VL   |                  24 |              0 |
    | EL   |                  12 |              4 |
    | SL   |                  12 |              4 |
    +------+---------------------+----------------+
    

    我尝试了以下代码:

    SELECT Type
           ,SUM(Amount) as 'TotalScheduledLeave'
           ,CASE WHEN Date > GETUTCDATE()
           THEN SUM(Amount)
           ELSE 0
           END as 'TotalLeaveUsed'
    FROM TimeOffTable
    WHERE User = @UserId
    GROUP BY Type
    

    这将引发错误,因为选择列表中的日期不包含在聚合函数或group子句中。但是当我试着将日期分组时,我得到的值是错误的 'TotalScheduledLave'

    1 回复  |  直到 6 年前
        1
  •  2
  •   AB_87    6 年前

    试试这个:

    SELECT   Type ,
             SUM(Amount) AS 'TotalScheduledLeave' ,
             SUM(CASE WHEN [Date] > GETUTCDATE() THEN amount
                      ELSE 0
                 END) AS 'TotalLeaveUsed'
    FROM     TimeOffTable
    WHERE    USER = @UserId
    GROUP BY Type;