尝试使用带SUM函数的内部联接和SQL分组,但不起作用
我不明白这一点,不知道是否有人能帮我解决这个问题 我有两个表叫做RES_DATA和INV_DATA RES_数据包含我的客户,如下所示尝试使用带SUM函数的内部联接和SQL分组,但不起作用,sql,select,join,group-by,inner-join,Sql,Select,Join,Group By,Inner Join,我不明白这一点,不知道是否有人能帮我解决这个问题 我有两个表叫做RES_DATA和INV_DATA RES_数据包含我的客户,如下所示 CUSTOMER ID | NAME 1, Robert 2, John 3, Peter 库存数据包含其发票,如下所示 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 我正在尝试
CUSTOMER ID | NAME
1, Robert
2, John
3, Peter
库存数据包含其发票,如下所示
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语句,它将给出如下结果
CUSTOMER ID | NAME | TOTAL AMOUNT
1, Robert, £180.90
2, John, £400.00
3, Peter, £150.00
我想我需要2个内部联接来添加表和按Customer表分组的INVOICES表的总和值,但老实说,我认为我缺少了一些东西。甚至不能接近我需要的结果。这应该可以
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进行了测试:
基本上,这里发生的情况是,由于连接,您将从左侧的RES_数据表中获得与右侧每一行相同的行,即具有相同[CUSTOMER ID]值的INV_数据表。当您仅按左侧的列分组,然后仅对右侧的[AMOUNT]列求和时,它会保持左侧的一行不变,并对右侧的匹配值求和。使用子查询
选择*从库存数据内部联接选择[CUSTOMER ID],通过库存数据上的[CUSTOMER ID]T对库存数据组中的[TOTAL AMOUNT]求和[CUSTOMER ID]=T.[CUSTOMER ID]两种方法
分组
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
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
什么样的SQL?SQL Server?非常感谢您第一次使用的roryap。现在要明白这一点@用户3526836-不客气。我已经更新了我的答案,以便更清楚地说明发生了什么。希望有帮助。之所以也包含[NAME]是因为具有这些属性的元组被重复。我说的对吗?如果性能是一个因素,那么如何优化解决方案?这个答案将影响^2性能,如操作。对于一组人或超过该组的人来说,他们将被选中,但他正在寻找结果,不适用于性能。如果您在同一个表中加入,以便在表中的某个列中为表中的每一行获取group by,则此解决方案效果良好。此解决方案存在严重的性能问题。请不要考虑这个解决方案。
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