Sql 使用聚合来自2个表的数据进行查询

Sql 使用聚合来自2个表的数据进行查询,sql,oracle,aggregate,Sql,Oracle,Aggregate,我的Oracle数据库中有三个表: 人民: IdPerson PK Name Surname 收益: IdEarning IdPerson EarningValue IdAward PK IdPerson FK AwardDescription 奖项: IdEarning IdPerson EarningValue IdAward PK IdPerson FK AwardDescription 一个人可以有很多收入 收入可以有很多,也可以没有任何收入 一个人可以有很多奖项,一

我的Oracle数据库中有三个表:

人民:

IdPerson PK 
Name 
Surname
收益:

IdEarning 
IdPerson
EarningValue
IdAward PK
IdPerson FK
AwardDescription
奖项:

IdEarning 
IdPerson
EarningValue
IdAward PK
IdPerson FK
AwardDescription
  • 一个人可以有很多收入
  • 收入可以有很多,也可以没有任何收入
  • 一个人可以有很多奖项,一个奖项,或者没有任何奖项
我想进行一个将返回3列的查询:

  • 此姓氏的人所有收入价值的总和
  • 此人的所有奖励计数
一件重要的事情是,我还需要显示:0值,如果这个人没有任何奖励或收入。有一种可能性是,此人获得了奖励,但没有任何收入。


有可能进行这样的查询吗?

是的,有可能,您只需加入表即可

SELECT Peoples.Surname, SUM(Earnings.EarningValue) as Earnings, COUNT(Awards. IdPerson) as Awards 
FROM Peoples
INNER JOIN Earnings
ON Peoples.IdPerson = Earnings.IdPerson
INNER JOIN Awards
ON Peoples.IdPerson = Awards.IdPerson
GROUP BY Peoples.IdPerson;

是的,当然有可能。 您只需使用多个联接查询联接这些表,然后应用sum()函数获取收入之和,并应用Count()计算奖励数量。 请尝试以下查询:

SELECT P.Surname,
       Sum(E.EarningValue)AS Total_Earnings,
       Count(A.IdAward)   AS total_awards
FROM   Peoples P
       LEFT JOIN Earnings E
              ON P.IdPerson = E.IdPerson
       LEFT JOIN Awards A
              ON A.IdPerson = P.IdPerson
GROUP  BY P.IdPerson; 
返回此文件的内容:

SELECT p.Surname,
       (SELECT NVL(SUM(e.EarningValue), 0) 
        FROM Earnings e WHERE e.IdPerson = p.IdPerson) as SumEarnings,
       (SELECT COUNT(aIdAward) 
        FROM Awards a WHERE a.IdPerson = p.IdPerson) as CntAwards
FROM Peoples p

对于
sum
,可能还需要
coalesce
(在
null
上方显示
0
)。按人分组。姓氏我尝试过,但该查询返回的奖励太多,且总和中的收入值太高。它似乎在某处复制。还有一件事:我的db中有一些重复的姓氏,所以我认为不能按姓氏分组。尝试按id分组。告诉我如果总数仍然很高,那么分组也有问题,因为我需要显示姓氏,而不是PersonidWellcome来堆栈溢出。提供一些评论来帮助人们理解为什么你的答案能够解决他们的问题是个好主意。有一个问题:计算值太高。。例如,一个人有6个奖项,在这个计算中有36个奖项,这就是我需要的!非常感谢。当我制作测试专栏时,它对我起到了作用,并且这段代码选择了Peoples。姓氏,SUM(Earnings.EarningValue)作为收入,COUNT(Awards.IdPerson)作为Peoples.IdPerson上的Peoples内部加入收入的奖励。IdPerson=Earnings.IdPerson=Awards.IdPerson组BY Peoples.IdPerson;