联接中的SQL查询求和
我有两张桌子 表1:联接中的SQL查询求和,sql,Sql,我有两张桌子 表1: ╔══════╦══════════╦═════════╗ ║ Name ║ Date ║ Revenue ║ ╠══════╬══════════╬═════════╣ ║ A ║ 1/1/2001 ║ 20 ║ ║ A ║ 1/2/2001 ║ 20 ║ ║ B ║ 1/1/2001 ║ 40 ║ ╚══════╩══════════╩═════════╝ ╔══════╦══════╗ ║ Name ║ Tas
╔══════╦══════════╦═════════╗
║ Name ║ Date ║ Revenue ║
╠══════╬══════════╬═════════╣
║ A ║ 1/1/2001 ║ 20 ║
║ A ║ 1/2/2001 ║ 20 ║
║ B ║ 1/1/2001 ║ 40 ║
╚══════╩══════════╩═════════╝
╔══════╦══════╗
║ Name ║ Task ║
╠══════╬══════╣
║ A ║ Call ║
║ A ║ Foo ║
║ B ║ Bar ║
╚══════╩══════╝
表2:
╔══════╦══════════╦═════════╗
║ Name ║ Date ║ Revenue ║
╠══════╬══════════╬═════════╣
║ A ║ 1/1/2001 ║ 20 ║
║ A ║ 1/2/2001 ║ 20 ║
║ B ║ 1/1/2001 ║ 40 ║
╚══════╩══════════╩═════════╝
╔══════╦══════╗
║ Name ║ Task ║
╠══════╬══════╣
║ A ║ Call ║
║ A ║ Foo ║
║ B ║ Bar ║
╚══════╩══════╝
所以我加入了
SELECT sum(Revenue), t2.Name, T2.Task
FROM Table_1 as t1 JOIN Table_2 as t2 ON t1.Name = t2.Name
GROUP BY t2.Name
联接的结果表如下所示:
Result
Name Sum
A 80
B 40
问题是我希望A的和结果是40。如何修改查询?使用此查询:
SELECT Name, SUM(Revenue)
FROM Table_1
GROUP BY Name
我看不出将表1
连接到表2
有任何意义,因为您没有使用任务
列。使用此查询:
SELECT Name, SUM(Revenue)
FROM Table_1
GROUP BY Name
我看不出将
表1
连接到表2
有任何意义,因为您没有使用任务
列。问题的根源在于连接没有完成您期望它完成的任务。通过在“名称”上的两个表之间进行连接,您正在创建重复项。删除查询中的GROUPBY子句,您将完全明白我的意思
正如前面的回答中提到的,连接(在本例中)是多余的。我建议你更仔细地看问题。如何对数据进行结构化以避免数据重复
如果没有更多的数据,我无法为您提供更多的方向,但希望我的评论将为您指明正确的方向,您将在使用离散键值方面学到宝贵的一课。问题的根源在于联接没有达到您期望的效果。通过在“名称”上的两个表之间进行连接,您正在创建重复项。删除查询中的GROUPBY子句,您将完全明白我的意思 正如前面的回答中提到的,连接(在本例中)是多余的。我建议你更仔细地看问题。如何对数据进行结构化以避免数据重复
如果没有更多的数据,我无法为您提供更多的方向,但希望我的评论将为您指明正确的方向,您将在使用离散键值方面学到宝贵的一课。在加入表之前,您必须计算总和,如:
select t1.Name, t1.sum, t2.task from
(
SELECT Name, sum(Revenue) as sum FROM Table_1 group by Name
) as t1
JOIN
Table_2 as t2 ON t1.Name = t2.Name
在加入表之前,必须计算总和,如:
select t1.Name, t1.sum, t2.task from
(
SELECT Name, sum(Revenue) as sum FROM Table_1 group by Name
) as t1
JOIN
Table_2 as t2 ON t1.Name = t2.Name
也许他用它作为一个过滤器,即只显示表2中也存在的行。你还应该解释为什么他在查询中得到80,这是一个很好的教学机会。他得到80,因为当他加入name时,它返回4行,其中name=a(表1中的2行乘以表2中的2行)。4 * 20 = 80@Kyle你当然是对的。感谢您指出这一点。忘记将Task添加到select子句。可能他将其用作筛选器,即仅显示表2中也存在的行。您还应该解释为什么他在查询中得到80,这是一个很好的教学机会。他得到80,因为当他按name加入时,它返回4行,其中name=a(表_1中的2行乘以表_2中的2行)。4*20=80@Kyle您当然是对的。谢谢您指出这一点。忘记将任务添加到select子句。忘记将任务添加到select子句