【问题标题】:Multiple aggregate calculations using Group by使用 Group by 进行多次聚合计算
【发布时间】:2021-03-12 23:23:30
【问题描述】:

我有一个数据集 df1,我想在其中:

  1. 根据对 TotalB 列的分组取 TotalB 列的平均值
  2. 然后我想取这个新列并减去空闲值以获得使用值

df1

date        name    rack    TotalB  freeB   
11/20/2020  a       yes     11      5   
11/20/2020  a       yes     10      5   
11/20/2020  a       yes     12      5   
11/20/2020  a       yes     10      5   
11/20/2020  b       no      5       2   
11/20/2020  b       no      5       2   
11/20/2020  b       no      6       2   

期望的结果

date        name    rack    TotalB  freeB   UsedB
11/20/2020  a       yes     10.75       5    5.75
11/20/2020  b       no      5.33        2    3.33

我在做什么:

SELECT AVG(TotalB) AS AVG_TotalB, date, name, rack, TotalB, freeB, (AVG_TotalB - freeB) AS UsedB
FROM df1 
GROUP BY rack

任何建议都会有所帮助。

【问题讨论】:

    标签: sql sql-server aggregation


    【解决方案1】:

    您的查询似乎非常接近。大多数情况下你需要修复GROUP BY:

    SELECT date, name, rack,
           AVG(TotalB) AS AVG_TotalB, freeB,
           (AVG(TotalB) - freeB) AS UsedB
    FROM df1 
    GROUP BY date, name, rack, freeB;
    

    请注意,您不能在同一 SELECT 中重复使用列别名。您需要重复该表达式。

    【讨论】:

    • 啊,我明白了 - 让我试试这个!
    【解决方案2】:

    您需要将它们转换为 DECIMAL 以避免丢失小数部分。

    DECLARE @test TABLE (dateval date,  name varchar(50), rack varchar(10),  TotalB int,  freeB int)
    
    INSERt INTO @test
    values
    ('11/20/2020','a','yes',     11      ,5),   
    ('11/20/2020','a','yes',     10      ,5),   
    ('11/20/2020','a','yes',     12      ,5),   
    ('11/20/2020','a','yes',     10      ,5),   
    ('11/20/2020','b','no',      5       ,2),   
    ('11/20/2020','b','no',      5       ,2),   
    ('11/20/2020','b','no',      6       ,2);
    
    SELECT dateval,name, rack, freeB, cast(AVG(cast(totalB as decimal(5,2))) as decimal(5,2)) as TotalB, 
    cast(AVG(cast(totalB as decimal(5,2))) as decimal(5,2)) - freeB as UsedB FROM @test
    GROUP BY dateval,name, rack, freeB
    
    +------------+------+------+-------+--------+-------+
    |  dateval   | name | rack | freeB | TotalB | UsedB |
    +------------+------+------+-------+--------+-------+
    | 2020-11-20 | a    | yes  |     5 |  10.75 |  5.75 |
    | 2020-11-20 | b    | no   |     2 |   5.33 |  3.33 |
    +------------+------+------+-------+--------+-------+
    

    【讨论】:

      猜你喜欢
      • 2023-04-05
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2014-12-27
      • 2022-01-18
      • 2012-08-29
      • 2017-09-16
      相关资源
      最近更新 更多