如何在单独的列中获取 SQL 中分组列的总体摘要?

How to get overall summary of grouped columns in SQL in a separate column?

我有一个分组查询,它看起来像我从以下查询中得到的:

SELECT 
name, 
warehouse, 
COUNT(distinct orders) total_orders,
AVG(late_ship_flag) pct_late_ship,
SUM(units) sum_units,
FROM table1
GROUP BY 
name, 
warehouse

结果如下:

+----------+-----------+--------------+---------------+-----------+
| name     | warehouse | total_orders | pct_late_ship | sum_units |
+----------+-----------+--------------+---------------+-----------+
| company1 | 1         | 2            | 0             | 5244      |
+----------+-----------+--------------+---------------+-----------+
| company1 | 2         | 19           | 0.125         | 138264    |
+----------+-----------+--------------+---------------+-----------+
| company1 | 3         | 21           | 0.08952519    | 102681    |
+----------+-----------+--------------+---------------+-----------+
| company1 | 4         | 23           | 0.118733509   | 45456     |
+----------+-----------+--------------+---------------+-----------+
| company1 | 5         | 12           | 0.077922078   | 18396     |
+----------+-----------+--------------+---------------+-----------+

我衡量绩效的方式是仓库延迟发货的次数百分比,因此我希望有一个列显示公司级别的每个仓库的平均百分比。如何在单个查询中获得以下输出?关于如何做到这一点,我唯一的想法是用公司的平均值临时 table 并将其加入上面的分组输出。

理想输出:

+----------+-----------+--------------+---------------+-----------+------------------+
| name     | warehouse | total_orders | pct_late_ship | sum_units | average_pct_late |
+----------+-----------+--------------+---------------+-----------+------------------+
| company1 | 1         | 2            | 0             | 5244      | .10287           |
+----------+-----------+--------------+---------------+-----------+------------------+
| company1 | 2         | 19           | 0.125         | 138264    | .10287           |
+----------+-----------+--------------+---------------+-----------+------------------+
| company1 | 3         | 21           | 0.08952519    | 102681    | .10287           |
+----------+-----------+--------------+---------------+-----------+------------------+
| company1 | 4         | 23           | 0.118733509   | 45456     | .10287           |
+----------+-----------+--------------+---------------+-----------+------------------+
| company1 | 5         | 12           | 0.077922078   | 18396     | .10287           |
+----------+-----------+--------------+---------------+-----------+------------------+

如果你想要所有仓库的平均百分比,那么你可以使用:

AVG(AVG(late_ship_flag)) OVER (PARTITION BY name) as overall_pct_late_ship

如果您不想要平均值的平均值,您的下一个选择是从其组成部分计算平均值...AVG(late_ship_flag) = SUM(late_ship_flag) / COUNT(late_ship_flag)

在现有 GROUP BY 上使用 window 函数,那将是...

SUM(SUM(  late_ship_flag)) OVER (PARTITION BY name) * 1.0
/
SUM(COUNT(late_ship_flag)) OVER (PARTITION BY name)