单个MySQL查询可返回不同的分类平均值

时间:2018-11-16 08:56:47

标签: mysql sql

我有一个MySQL数据库,该数据库包含一个包含3列的表:调查,类型和响应。每个调查可以具有多种类型,每种类型可以具有多种响应。响应是一个整数。

|--------|-------|----------|
| survey | type  | response |
|--------|-------|----------|
| Food   | Men   |    4     |
|--------|-------|----------|
| Food   | Men   |    5     |   
|--------|-------|----------|
| Food   | Women |    1     |
|--------|-------|----------|
| Food   | Women |    3     | 
|--------|-------|----------|
| Drink  | Old   |    3     |
|--------|-------|----------|
| Drink  | Old   |    5     |   
|--------|-------|----------|
| Drink  | Young |    1     |
|--------|-------|----------|

是否可以在单个SQL查询中返回来自相同调查的所有响应以及来自相同类型的所有响应的平均响应?

使用以下带有GROUP BY的SQL会返回每种类型的平均值

`SELECT survey, type, AVG(response) FROM 'test' GROUP BY survey, type`

但是有没有办法修改查询以返回调查平均值(类型的组合)以输出类似下面的内容?

|--------|-------|---------------|
| survey | type  | AVG(response) |
|--------|-------|---------------|
| Food   | Men   |      4.5      |
|--------|-------|---------------|
| Food   | Women |       2       |
|--------|-------|---------------|
| Food   | ----- |      3.25     | 
|--------|-------|---------------|
| Drink  | Old   |       4       |
|--------|-------|---------------|
| Drink  | Young |       1       |   
|--------|-------|---------------|
| Drink  | ----- |      2.5      |
|--------|-------|---------------|

当前,我必须使用循环来输入新的调查并输入值以检索这两个平均响应,但是,如果可以不使用循环就可以实现,那么在单个查询中,效率会更高。

在此示例中,我使用一个非常简化的表来说明问题:)

2 个答案:

答案 0 :(得分:2)

您还可以尝试使用WITH ROLLUP选项

create table t(survey varchar(50),type varchar(50), response int);

insert into t values('Food','Men',4);
insert into t values('Food','Men',5);
insert into t values('Food','Women',1);
insert into t values('Food','Women',3);
insert into t values('Drink','Old',3);
insert into t values('Drink','Old',5);
insert into t values('Drink','Young',1);


select survey,type,avg(response)
  from t
group by survey,type with rollup; 

答案 1 :(得分:0)

为此,您可以将OVER子句与PARTITION BY一起使用

SELECT survey, 
       type, 
       AVG(response) AS AVGTYPE,
       AVG(response) OVER(PARTITION BY survey) AS AVGSURVEY 
FROM test 
GROUP BY survey, type