尝试将 INNER JOIN 和 GROUP BY SQL 与 SUM 函数一起使用,但不工作

Posted

技术标签:

【中文标题】尝试将 INNER JOIN 和 GROUP BY SQL 与 SUM 函数一起使用,但不工作【英文标题】:Trying to use INNER JOIN and GROUP BY SQL with SUM Function, Not Working 【发布时间】: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? 【参考方案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 也很有帮助)。

以上是关于尝试将 INNER JOIN 和 GROUP BY SQL 与 SUM 函数一起使用,但不工作的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 模型上执行 INNER JOIN、GROUP BY 和 COUNT

在 MongoDB 中使用 group by、inner join 和嵌套条件进行聚合

使用 GROUP BY 和聚合函数的多个 INNER JOIN

是否应该在 SQLite 中使用 GROUP BY 在 UNION 上进行 INNER JOIN 花费数小时?

MySQL Multiple INNER JOIN + GROUP BY 未按预期工作

sqllinq和lambda查询语句比较inner join和group by组合使用及匿名类型的处理