Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 三表接一组_Sql_Database_Join_Group By - Fatal编程技术网

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来说不是这样。