我有一个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 |
|--------|-------|---------------|
当前,我必须使用循环来输入新的调查并输入值以检索这两个平均响应,但是,如果可以不使用循环就可以实现,那么在单个查询中,效率会更高。
在此示例中,我使用一个非常简化的表来说明问题:)
答案 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