【问题标题】:Trying to use INNER JOIN and GROUP BY SQL with SUM Function, Not Working尝试将 INNER JOIN 和 GROUP BY SQL 与 SUM 函数一起使用,但不工作
【发布时间】:2014-05-26 16:51:50
【问题描述】:

我不明白这一点,想知道是否有人可以帮助我解决这个问题。

我有 2 个名为 RES_DATAINV_DATA 的表

RES_DATA 包含我的客户如下

CUSTOMER ID | NAME

1, Robert
2, John
3, Peter

INV_DATA 包含他们的发票如下

INVOICE ID | CUSTOMER ID | AMOUNT

100, 1, £49.95
200, 1, £105.95
300, 2, £400.00
400, 3, £150.00
500, 1, £25.00

我正在尝试写一个SELECT STATEMENT,它会给我如下结果。

CUSTOMER ID | NAME | TOTAL AMOUNT

1, Robert, £180.90
2, John, £400.00
3, Peter, £150.00

我认为我需要 2 INNER JOINS 以某种方式添加按客户表分组的 INVOICES 表的表和 SUM 值,但老实说,我认为我遗漏了一些东西。甚至无法接近我需要的结果。

【问题讨论】:

  • 什么样的SQL? SQL Server?

标签: sql select join group-by inner-join


【解决方案1】:

这应该可行。

SELECT a.[CUSTOMER ID], a.[NAME], SUM(b.[AMOUNT]) AS [TOTAL AMOUNT]
FROM RES_DATA a INNER JOIN INV_DATA b
ON a.[CUSTOMER ID]=b.[CUSTOMER ID]
GROUP BY a.[CUSTOMER ID], a.[NAME]

我使用 SQL Fiddle 针对 SQL Server 2008 对其进行了测试:http://sqlfiddle.com/#!3/1cad5/1

基本上这里发生的事情是,由于连接,对于“右侧”的每一行(即INV_DATA 表),您在“左侧”(即来自RES_DATA 表)上获得相同的行) 具有相同的[CUSTOMER ID] 值。当您仅按左侧的列进行分组,然后从右侧仅对 [AMOUNT] 列进行求和时,它会保持左侧的一行完整,并从右侧总结匹配值.

【讨论】:

  • 非常感谢第一次工作的 roryap。现在来了解这一点!
  • @user3526836 -- 不客气。我已经更新了我的答案,以便更清楚地了解发生了什么。希望对您有所帮助。
  • a.[NAME] 也包括在内的原因是具有这些属性的元组被重复。我说的对吗?
  • 如果性能是一个因素,如何优化解决方案?
【解决方案2】:

两种方法...

分组方式

SELECT RES.[CUSTOMER ID], RES,NAME, SUM(INV.AMOUNT) AS [TOTAL AMOUNT]
FROM RES_DATA RES
JOIN INV_DATA INV ON RES.[CUSTOMER ID] INV.[CUSTOMER ID]
GROUP BY RES.[CUSTOMER ID], RES,NAME

结束

SELECT RES.[CUSTOMER ID], RES,NAME, 
       SUM(INV.AMOUNT) OVER (PARTITION RES.[CUSTOMER ID]) AS [TOTAL AMOUNT]
FROM RES_DATA RES
JOIN INV_DATA INV ON RES.[CUSTOMER ID] INV.[CUSTOMER ID]

【讨论】:

    【解决方案3】:

    使用子查询

    SELECT * FROM RES_DATA inner join (SELECT [CUSTOMER ID], sum([TOTAL AMOUNT]) FROM INV_DATA group by [CUSTOMER ID]) T on RES_DATA.[CUSTOMER ID] = t.[CUSTOMER ID]

    【讨论】:

    • 这个答案将具有O(n^2) 性能,作为操作。到将有O(n)的组
    • 确实,但他在寻找结果,而不是为了表现。
    • 当您在同一个表中加入以在表中的某个列中为表中的每一行获取分组时,此答案效果很好。
    • 此解决方案存在严重的性能问题。请不要考虑这个解决方案。
    【解决方案4】:

    如果您需要检索除分组列之外的更多列,则可以考虑以下查询。检查一次它是否表现良好。

    SELECT 
    a.[CUSTOMER ID], 
    a.[NAME], 
    (select SUM(b.[AMOUNT]) from INV_DATA b
    where b.[CUSTOMER ID] = a.[CUSTOMER ID]
    GROUP BY b.[CUSTOMER ID]) AS [TOTAL AMOUNT]
    FROM RES_DATA a
    

    【讨论】:

      【解决方案5】:
      SELECT RES.[CUSTOMER ID], RES.NAME, SUM(INV.AMOUNT) AS [TOTAL AMOUNT]
      FROM RES_DATA
      JOIN INV_DATA ON RES.[CUSTOMER ID]=INV.[CUSTOMER ID]
      GROUP BY RES.[CUSTOMER ID], RES.NAME
      

      【讨论】:

      • 请解释您的代码(即使代码 cmets 也很有帮助)。
      猜你喜欢
      • 2021-04-01
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多