我有一个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 |
|--------|-------|---------------|
目前,我必须使用循环来输入新的调查和类型值,以检索这两个平均响应。然而,如果可以在没有循环的情况下在单个查询中实现这一点,则效率会更高。
我在这个例子中使用了一个非常简化的表格来说明这个问题:(
您也可以尝试使用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;
您可以将OVER
子句与PARTITION BY
一起用于此
SELECT survey,
type,
AVG(response) AS AVGTYPE,
AVG(response) OVER(PARTITION BY survey) AS AVGSURVEY
FROM test
GROUP BY survey, type