[英]SQL group function for multiple columns?
我真的需要这个问题的帮助。
给定两个关系的实例,查询的结果是什么? 我知道答案,我只需要知道你如何得到它? 我对GROUP
系列感到非常困惑。
关系R(A,B):
1 2
3 4
1 3
关系S(B,C):
1 3
2 4
查询:
SELECT R.A, avg(R.B) as av
FROM R, S
WHERE R.B < 4
GROUP BY R.A, S.C
HAVING max(S.B) >= 2
答案是:
A Av
1 2.5
您选择的RB <4的RA。有两个合格记录,它们的值均为1。
您正在R和S之间进行笛卡尔联接,但未从S中选择任何东西,因此与S有关的事情都是无关紧要的。
返回R,B的两个小于4的值为2和3。这两个数字的平均值为2.5。
您按SC分组而不选择它的事实将导致查询崩溃。
JOIN
两个表:
SELECT R.A, R.B
FROM RelationR AS r
LEFT JOIN RelationS AS s ON r.b = s.b
它为您提供:
| A | B |
---------
| 1 | 2 |
| 3 | 4 |
| 1 | 3 |
然后,您只需要像这样将A
分组:
SELECT
R.A,
AVG(R.B) * 1.0 AS av
FROM RelationR AS R
LEFT JOIN RelationS AS S ON R.B = S.B
WHERE R.B < 4
GROUP BY R.A
HAVING MAX(S.B) >= 2;
这将为您提供:
| A | AV |
-----------
| 1 | 2.5 |
看一下这个SQLFiddle演示,它只需几个步骤即可运行您的语句。
首先,这个
SELECT R.A, R.B, S.B AS sb, S.C
FROM R, S
ORDER BY R.A, S.C
这给你:
A B SB C
1 2 1 3
1 3 1 3
1 2 2 4
1 3 2 4
3 4 1 3
3 4 2 4
然后使用WHERE
约束运行它:
SELECT R.A, R.B, S.B AS sb, S.C
FROM R, S
WHERE R.B < 4
ORDER BY R.A, S.C
这使:
A B SB C
1 2 1 3
1 3 1 3
1 2 2 4
1 3 2 4
然后通过GROUP BY
运行它。 通常,您只能使用GROUP BY
或其他列中提到的列,而只能使用诸如avg
或max
类的聚合函数(但是MySQL宽容的,这就是为什么在本示例中使用PostgreSQL服务器以更好地与SQL92兼容):
SELECT R.A, avg(R.B) AS av, S.C, max(S.B) AS maxsb
FROM R, S
WHERE R.B < 4
GROUP BY R.A, S.C
产生:
A AV C MAXSB
1 2.5 3 1
1 2.5 4 2
添加HAVING
子句(仅保留上一行结果):
SELECT R.A, avg(R.B) as av, S.C, max(S.B) AS maxsb
FROM R, S
WHERE R.B < 4
GROUP BY R.A, S.C
HAVING max(S.B) >= 2
产生:
A AV C MAXSB
1 2.5 4 2
最后,将未使用的列放在SELECT
:
SELECT R.A, avg(R.B) as av
FROM R, S
WHERE R.B < 4
GROUP BY R.A, S.C
HAVING max(S.B) >= 2
并得到:
A AV
1 2.5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.