我将加入三个表,然后将一列与另一列的值相加。
SELECT t1.column, t2.column, SUM(t1.column * t2.column)
FROM table1 t1
INNER JOIN table2 t2
ON t1.id = t2.id
JOIN table3 t3
ON t2.id = t3.id
GROUP BY t1.column, t2.column;
这个查询做了我想要的,但我不明白为什么GROUP BY
有效?
如果我在select中添加列,我还要按列添加列吗?
答案 0 :(得分:4)
你真的知道你在这做什么吗?
SELECT t1.column, t2.column, SUM(t1.column * t2.column)
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id
JOIN table3 t3 ON t2.id = t3.id
GROUP BY t1.column, t2.column;
该查询至少有两种方式可疑:
不使用表3 - 除了验证t3中是否存在t2中的id的记录。你想要那个吗? Potential pitfall
如果每个t2记录有多个T3记录,则会得到cartesian product,这是SUM列的意外乘法。
GROUP BY t1.column,t2.column - 它结合了(t1.column, t2.column)
的所有唯一组合,并将t1.column * t2.column
的结果相加。这真的是你追求的吗?
对于第2点,请考虑此(来源)数据:
t1.id, t1.column, t2.column, t1.column*t2.column
1 2 3 6
2 2 3 6
3 3 3 9
4 3 4 12
你最终得到了输出
t1.column, t2.column, SUM(t1.column*t2.column)
2 3 12
3 3 9
3 4 12
看到(2,3)结合了总和。
如果我在select中添加列,我还必须按列添加列。
SELECT中的列(MySQL之类的某些DBMS除外)必须是聚合(例如sum / avg / min / max)或GROUP BY子句中的列。 您可以使用其他表达式,例如标量函数或不直接来自表格的常量值。
如果您确实需要将表相关中的更多列添加到聚合中,您需要清楚地思考为什么。例如如果你按列1和平均列2进行分组,那么你应该对column3做什么 - 它应该来自哪一行?
答案 1 :(得分:1)
这是因为SUM是一个聚合函数,它是根据每个组的结果计算的。
答案 2 :(得分:1)
首先不要担心JOIN
。要了解GROUP BY
,请先查看一个非常简单的查询。
SELECT t1.year, t1.person
FROM table t1
这将返回
year | person 2000 | Joe 2000 | Betty 2000 | Marty 2001 | Joe 2002 | Betty
如果你投入聚合函数,你必须为聚合函数未涵盖的所有内容包含GROUP BY
。
SELECT t1.year, COUNT(t1.person) as counter
FROM table t1
GROUP BY t1.year
year | counter 2000 | 3 2001 | 1 2002 | 1
如果您不包含GROUP BY
,则它不起作用,因为数据库确实不知道您希望如何对数据进行分组。
答案 3 :(得分:0)
当GROUP BY有多个参数时,就像你的情况一样,它意味着“首先按定义排序#1,如果有多个定义#1,那么按定义排序#2,如果有多个定义#2”然后将这些组合在一起。“。
答案 4 :(得分:0)
作为聚合函数目标的列不必是GROUP BY
子句的一部分。聚合函数是SUM, AVG, MIN, MAX
等函数。
答案 5 :(得分:0)
因为Aggregate函数为您提供了一个返回值...
首先它将排序然后使用不同的排序结果集对该集合执行聚合操作。