SQL 内连接与 Group By

问题描述 投票:0回答:6

我有下表。

Table1
Field1 Field2
ID111    1,500
ID112    100
ID111    250
ID114    50
ID114    20

Table2
Field1 Field3
ID111  Chris
ID112  Mary
ID114  John

我想要的是下图所示的结果。

ID111 Chris 1,750
ID112 Mary  100
ID114 John  70

我已经通过使用 2 个 sql 执行来实现这一点。感谢昨晚在这个网站上提供帮助的人,我只使用 1 个 sql 语句就让它工作了。但是,我无法将第一个表链接到第二个表以获取更多信息。

通过使用

SELECT SUM(ctotal) AS TransactionTotal 
FROM   table1 
GROUP  BY field1 

我能够实现

ID111 1,750
ID112 100
ID114 70

我目前正在使用这个sql语句,它弹出一个错误。

SELECT SUM(ctotal) AS TransactionTotal, 
       table2.field3 
FROM   table1 
       INNER JOIN table2 
               ON table1.field1 = table2.field1 
GROUP  BY table1.field1 

它说不能“您试图执行一个不包含指定表达式“Field3”作为聚合函数一部分的查询。”

如果有人知道解决此问题的方法,我将非常感激。

sql group-by sum inner-join
6个回答
3
投票

这应该足够了-

  SELECT t1.firld1, t2.field3,
         sum(t1.CTotal) as cTotal
    FROM table1 t1 INNER JOIN table2 t2
         ON t1.field1 = t2.field1
GROUP BY t1.field1, t2.field3

无论您在

SELECT
语句中选择的不是聚合函数的列(即未使用
COUNT
SUM
或其他聚合函数的列),也应在
GROUP BY
子句中提及。

这在 MySQL 中并没有特别遵循(有时会产生不需要的结果),但在 Oracle 中是强制性的。然而,当您使用上述查询时,大多数 RDBMS 都会产生类似的结果。


1
投票

正如 Blorgbear 和 Matt Welch 所说,您需要将不在聚合函数中的所有列包含在 group by 中。

这样做的原因是您试图告诉它对一个值求和,而不是在其他列中放入什么。

考虑一下其他两列中的数据,如果您没有对其指定操作(例如 Min(拉取最小值)),它如何知道显示 100,250 或 Field2 的任何其他值

这里是聚合函数的列表: http://www.w3schools.com/sql/sql_functions.asp


0
投票

您需要

group by
您在
select
中包含的列:

Select SUM(CTotal) as TransactionTotal, Table2.Field3 
from Table1 
INNER JOIN Table2 ON Table1.Field1=Table2.Field1 
GROUP BY Table1.Field3

0
投票

将 Field3 添加到 GROUP BY 子句中,如下所示:

Select SUM(CTotal) as TransactionTotal, Table2.Field3 from Table1 
INNER JOIN Table2 ON Table1.Field1=Table2.Field1 GROUP BY Table2.Field3

0
投票

试试这个

Select SUM(CTotal) as TransactionTotal, max(Table2.Field3) Field3  from Table1 
INNER JOIN Table2 ON Table1.Field1=Table2.Field1 GROUP BY Table1.Field1

Select SUM(CTotal) as TransactionTotal, Table2.Field3  from Table1 
INNER JOIN Table2 ON Table1.Field1=Table2.Field1 GROUP BY Table1.Field1, Table2.Field3

0
投票

除了在

group by
语句中添加条目之外,您还可以使用
with
语句将其编写为 CTE。您首先定义总和的结果集,然后使用引用该结果集的第二个查询来输出数据。

with total as (
  select Field1, SUM(ctotal) as TransactionTotal 
    from Table1 
    group by Field1
)
select Table2.Field1, Table2.Field3, total.TransactionTotal
  from Table2
  inner join total on Table2.Field1 = total.Field1
;
© www.soinside.com 2019 - 2024. All rights reserved.