【问题标题】:One MySQL query to get AVG by different Groupings?通过不同分组获取 AVG 的一个 MySQL 查询?
【发布时间】:2013-07-16 17:57:31
【问题描述】:

想知道有没有一种方法可以在一个 MySQL 查询中编写以下内容。

我有一张桌子: cust_ID | rpt_name | req_secs

在我想得到的查询中:

按 cust_ID 分组时的 AVG req_secs

按 rpt_name 分组时的 AVG req_secs

总 req_secs AVG

我知道我可以对同一张表进行单独的分组查询,然后将结果合并为一个。但我希望有某种方法可以在一个查询中做到这一点。

谢谢。

【问题讨论】:

  • 不清楚为什么您选择了不可能的答案,而该问题的其他答案表明这是可能的。

标签: mysql group-by average


【解决方案1】:

嗯,以下将做三分之二:

select n,
       (case when n = 1 then cast(cust_id as varchar(255)) else rpt_name end) as grouping,
       avg(req_secs)
from t cross join
     (select 1 as n union all select 2
     ) n
group by n, (case when n = 1 then cust_id else rpt_name end);

这基本上将数据“加倍”,然后对每个组进行聚合。这假定cust_idrpt_name 是兼容的类型。 (如果不是这种情况,可以调整查询。)

其实,你可以使用rollup得到整体平均值:

select n,
       (case when n = 1 then cust_id else rpt_name end) as grouping,
       avg(req_secs)
from t cross join
     (select 1 as n union all select 2
     ) n
group by n, (case when n = 1 then cast(cust_id as varchar(255)) else rpt_name end) with rollup

这适用于平均值,因为“加倍”数据的平均值与原始数据的平均值相同。它不适用于sum()count()

【讨论】:

  • +1。需要注意的是grp_IDrpt_name 的数据类型需要兼容;没有任何其他信息,看起来 rpt_name 可能是字符,而 grp_ID 可能是整数。指定从 int 到 varchar 的显式转换/强制转换的小调整可以解决此问题。
【解决方案2】:

不,没有。您可以同时按 cust_ID 和 rpt_name 的组合进行分组(即两级分组),但您不能同时进行单独的顶级分组和非分组聚合。

【讨论】:

  • 好的。感谢您的快速回复。
【解决方案3】:

由于 GROUP BY 的工作方式,执行此操作的 SQL 有点棘手。获取结果的一种方法是获取行的三个副本,并将每组行分别分组。

SELECT g.gkey
     , IF(g.grp='cust_id',t.cust_ID,IF(g.grp='rpt_name',t.rpt_name,'')) AS gval
     , AVG(t.req_secs) AS avg_req_secs
  FROM (SELECT 'cust_id' AS gkey UNION ALL SELECT 'rpt_name' UNION ALL SELECT 'total') g
 CROSS
  JOIN mytable t
 GROUP 
    BY g.gkey
     , IF(g.grp='cust_id',t.cust_ID,IF(g.grp='rpt_name',t.rpt_name,''))

别名为“g”的内联视图不必使用 UNION ALL 运算符,您只需要一个行集,该行集正好返回 3 行具有不同值的行。我只是使用 UNION ALL 作为将三个文字值作为行集返回的便捷方式,因此我可以将其加入到原始表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2013-11-29
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多