多个group by在同一个select语句中

时间:2013-08-04 17:50:55

标签: sql sqlite

我有一个带有相同where子句的sql select语句,我需要使用多个group by来显示结果。我的表有超过10万行,我不想多次执行相同的select语句以不同方式显示聚合结果。我的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
...

有没有人知道如何在不执行多个select语句的情况下执行上述操作?

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

1 个答案:

答案 0 :(得分:1)

可能可以组合多个GROUP BY,但这需要您在代码中处理结果,而不是所有聚合函数都易于处理。

首先,按多个字段分组:

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查询。 (同样,您需要保留足够的信息才能正确计算平均值。)