在同一选择语句上进行多个分组

Posted

技术标签:

【中文标题】在同一选择语句上进行多个分组【英文标题】:multiple group by on same select statement 【发布时间】:2013-08-04 17:50:55 【问题描述】:

我有一个带有相同 where 子句的 sql select 语句,我需要使用许多 group by 来呈现结果。我的表有超过 10 万行,我不想多次执行相同的选择语句来以不同的方式显示聚合结果。我的 sql 语句很长,但这里是我目前正在做的一个简单示例:

select term, count (loans), avg(days), sum(amt) where purpose = "debt" group by term
select length, count (loans), avg(days), sum(amt) where purpose = "debt" group by length
select funded, count (loans), avg(days), sum(amt) where purpose = "debt" group by funded
...

有谁知道无需执行多个选择语句即可完成上述操作的方法?

我已尝试对临时表执行初始查询并对该表执行分组以保存初始查询,但假设初始查询不包含所有行(where 子句可以根据用户输入更改)。

【问题讨论】:

【参考方案1】:

可能可以合并多个GROUP BYs,但这需要你在代码中处理结果,并不是所有的聚合函数都易于处理。

首先,按多个字段分组:

SELECT term, length, COUNT(loans), AVG(days), SUM(amt)
FROM MyTable
WHERE purpose = 'debt'
GROUP BY term, length

这将导致比您实际想要的更多的组;例如:

term length COUNT(loans) AVG(days) SUM(amt)
---- ------ ------------ --------- --------
T1   L1               12       3.4       56
T1   L2                7       8.9       10
T2   L1               23       4.5        6
T2   L2               78       9          1

然后,您必须组合这些记录以获得特定组的结果。 例如,要获得与GROUP BY term 相同的结果,请将具有相同term 值的所有记录合并:

term length COUNT(loans) AVG(days) SUM(amt)
---- ------ ------------ --------- --------
T1   -         12+7 = 19       ??? 56+10=66
T2   -       23+78 = 101       ???  6+1 = 7

对于COUNTSUM 函数,您可以简单地添加值。 对于 AVG 函数,您需要记录计数 (COUNT(days)) 才能正确组合它们。


最好将所有字段的分组结果存储到一个临时表中,然后为您的实际结果执行额外的GROUP BY 查询。 (同样,您需要保留足够的信息才能正确计算平均值。)

【讨论】:

谢谢CL,我试试看。

以上是关于在同一选择语句上进行多个分组的主要内容,如果未能解决你的问题,请参考以下文章

如何在获得完全外部联接的同一列上进行选择?

MySQL如何使用Not Exist在多个表上进行选择

分组选择符

在 DataGridView 的同一列上添加多个数据源

如何在一个列上进行分组,在另一个列上聚合数组并创建一个由分组列作为键的 JSON 对象

20170417-2