【问题标题】:SQL Inner Join with Group By使用 Group By 的 SQL 内部联接
【发布时间】:2013-12-12 02:38:24
【问题描述】:

我有如下所示的表格。

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' 作为聚合函数的一部分。”

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

【问题讨论】:

  • GROUP BY 子句中包含 Table2.Field3
  • table2.Field3 必须出现在 group by 子句中或包含在和聚合函数中,例如 SUM()、MAX()、MIN()、AVG()、...

标签: sql group-by sum inner-join


【解决方案1】:

这就够了-

  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 语句中选择的不是聚合函数的列(即未使用COUNTSUM 或其他聚合函数的列)也应在GROUP BY 中提及子句。

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

【讨论】:

  • 维纳斯圣母,正是我想要的解释!赞!谢谢。
  • 您使用的是什么数据库?如果我知道你在做什么,我可以给你相关的链接供你参考。
  • 我现在正在使用 Access。我通常只在开发阶段使用 Access。但是在部署时,我总是使用 MSSQL 服务器 2005、2008 或 2012。:)
【解决方案2】:

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

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

想想你在其他两列中的数据,如果你没有指定一个动作,比如 Min(拉最小值),它怎么知道显示 100,250 或 Field2 的任何其他值

p>

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

【讨论】:

    【解决方案3】:

    您需要group byselect中包含的列:

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

    【讨论】:

    • 您好,感谢您的回复,我尝试了您的解决方案,但现在它显示“您尝试执行的查询不包括作为聚合函数的一部分的指定表达式 'Field1'。” :(
    【解决方案4】:

    像这样将 Field3 添加到 GROUP BY 子句中:

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

    【讨论】:

      【解决方案5】:

      试试这个

      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
      

      【讨论】:

      • table2.Field3 必须出现在 group by 子句中或包含在和聚合函数中,例如 SUM()、MAX()、MIN()、AVG()、...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2013-01-08
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多