繁体   English   中英

多个列的SQL组功能?

[英]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;

SQL小提琴演示

这将为您提供:

| 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或其他列中提到的列,而只能使用诸如avgmax类的聚合函数(但是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM