使用 Group by 进行多次聚合计算

Posted

技术标签:

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

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

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

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

任何建议都会有所帮助。

【问题讨论】:

【参考方案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 |
+------------+------+------+-------+--------+-------+

【讨论】:

以上是关于使用 Group by 进行多次聚合计算的主要内容,如果未能解决你的问题,请参考以下文章

Group by 包含非聚合列

Group by

聚合函数以及MYSQL分组查询——GROUP BY语句(一天一个小技巧,明天你就是专业人士,欧耶!)

聚合函数以及MYSQL分组查询——GROUP BY语句(一天一个小技巧,明天你就是专业人士,欧耶!)

mysql 可以group by 两个字段吗

mysql group by 能用到索引么