多列的SQL组功能?

时间:2013-02-24 03:21:39

标签: mysql sql database

我真的需要这个问题的帮助。

给定两个关系的实例,查询的结果是什么?我知道答案,我只需知道你是怎么得到它的?关于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

3 个答案:

答案 0 :(得分:0)

您正在选择R.A,其中R.B&lt; 4.有两个合格记录,它们的值均为1.

你在R和S之间进行笛卡尔连接,但是没有从S中选择任何东西,所以与S有关的任何事情都是无关紧要的。

回到R,B的两个小于4的值是2和3.这两个数的平均值是2.5。

您在没有选择的情况下由S.C进行分组这一事实会导致您的查询崩溃。

答案 1 :(得分:0)

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 Fiddle Demo

这会给你:

| A |  AV |
-----------
| 1 | 2.5 |

答案 2 :(得分:0)

看看这个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