Sql 三表接一组
我将连接三个表,然后将其中一列与另一列的值相乘Sql 三表接一组,sql,database,join,group-by,Sql,Database,Join,Group By,我将连接三个表,然后将其中一列与另一列的值相乘 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; 此查询符合我的要求,但我不明白为什么分组
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;
此查询符合我的要求,但我不明白为什么分组依据
有效
如果我将列添加到select,我还必须将列添加到group by?这是因为SUM是一个根据每个组的结果计算的聚合函数。这是因为SUM是一个根据每个组的结果计算的聚合函数。当group by具有多个参数时,如您的情况,它的意思是“首先按定义排序#1,如果有多个定义#1,则按定义排序#2,如果有多个定义#2,则将它们组合在一起。”当group by有多个参数时,如在您的案例中,它意味着“首先按定义1排序,如果有多个定义1,则按定义2排序,如果有多个定义2,则将其分组。“作为聚合函数目标的列不必是
GROUP BY
子句的一部分。聚合函数是诸如SUM、AVG、MIN、MAX等函数。作为聚合函数目标的列不必是GROUP BY
子句的一部分。聚合函数是诸如SUM、AVG、MIN、MAX等函数。首先不要担心连接。要理解分组依据,请先看一个非常简单的查询
SELECT t1.year, t1.person
FROM table t1
这会回来的
year | person
2000 | Joe
2000 | Betty
2000 | Marty
2001 | Joe
2002 | Betty
年份计数器
2000 | 3
2001 | 1
2002 | 1
如果您不包括分组依据
,它将不起作用,因为数据库实际上不知道您要如何分组数据。首先不要担心加入
。要理解分组依据,请先看一个非常简单的查询
SELECT t1.year, t1.person
FROM table t1
这会回来的
year | person
2000 | Joe
2000 | Betty
2000 | Marty
2001 | Joe
2002 | Betty
年份计数器
2000 | 3
2001 | 1
2002 | 1
如果不包括分组依据,则它将不起作用,因为数据库实际上不知道您要如何对数据进行分组。因为聚合函数会给您一个返回值
首先它将进行排序,然后使用不同的排序结果集对该集合执行聚合操作。因为聚合函数会给您一个返回值
首先它将进行排序,然后使用不同的排序结果集对该集合执行聚合操作。您真的知道您在这里做什么吗
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的记录。你想要吗
潜在陷阱
如果每个t2记录有多个T3记录,您将得到一个,是SUM列的意外乘法
- 按t1.column,t2.column分组-这将组合
(t1.column,t2.column)
的所有唯一组合,并将t1.column*t2.column
的结果相加。这真的是你想要的吗
关于点2,考虑这个(源)数据:
您最终得到了输出
t1.column, t2.column, SUM(t1.column*t2.column)
2 3 12
3 3 9
3 4 12
请注意(2,3)已将总和相加
如果将列添加到select,则还必须将列添加到group by
SELECT中的列(MySQL等某些DBMS除外)必须是聚合(例如sum/avg/min/max)或GROUP BY子句中的列。还可以使用其他表达式,如标量函数或常量值,而不是直接从表中获取
如果您确实需要从与聚合相关的表中获得更多的列,那么您需要清楚地考虑原因。e、 g.如果您按第1列分组并对第2列求平均值,那么您打算对第3列做什么?它应该来自哪一行?您真的知道您在这里做什么吗
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的记录。你想要吗
潜在陷阱
如果每个t2记录有多个T3记录,您将得到一个,是SUM列的意外乘法
- 按t1.column,t2.column分组-这将组合
(t1.column,t2.column)
的所有唯一组合,并将t1.column*t2.column
的结果相加。这真的是你想要的吗
关于点2,考虑这个(源)数据:
您最终得到了输出
t1.column, t2.column, SUM(t1.column*t2.column)
2 3 12
3 3 9
3 4 12
请注意(2,3)已将总和相加
如果将列添加到select,则还必须将列添加到group by
SELECT中的列(MySQL等某些DBMS除外)必须是聚合(例如sum/avg/min/max)或GROUP BY子句中的列。还可以使用其他表达式,如标量函数或常量值,而不是直接从表中获取
如果您确实需要从与聚合相关的表中获得更多的列,那么您需要清楚地考虑原因。e、 g.如果您按第1列分组,并对第2列求平均值,那么您打算对第3列做什么?它应该来自哪一行?阅读此内容时需要考虑GroupBy的约束条件。非聚合的所有列必须是Group By子句的一部分。。。但是你的问题我不清楚。。。你到底在问什么?“非聚合的所有列都必须是Group By子句的一部分……”@S M Kamran:至少对于MySQL来说不是这样。阅读这篇文章的一些内容是GroupBy的约束。非聚合的所有列必须是Group By子句的一部分。。。但是你的问题我不清楚。。。你到底在问什么?“非聚合的所有列都必须是GROUPBY子句的一部分……”@S M Kamran:至少对MySQL来说不是这样。