SQL:从一个表,一列,不同的行获取总和

时间:2017-11-28 18:00:50

标签: sql oracle

这是我目前注册的基础SQL课程项目的最后一部分。教授几天没有回复我,明天就要回复了。

所以我有一个奇怪的问题,我需要一些解释。 我有一个表CUSTOMER,包含CID,SPONSORID,LAST_NAME和BALANCE_DUE。 一些客户(cid)赞助(赞助商)其他客户(cid),赞助商负责他们赞助的客户的balance_due和balance_due。被赞助的朋友包含在桌子上的朋友行中的SPONSORID列下赞助他们的客户的CID。并非所有赞助商都有balance_due,但他们赞助的客户可能有balance_due,反之亦然。我需要创建一个查询,返回赞助商的姓氏,他们的总朋友总数,他们的个人总金额,以及总计到期金额(总结他们所欠的和他们的朋友的欠款),仅使用其姓氏赞助商。

以下代码(以及跑步时的结果)似乎迄今为止似乎有效,但由于某种原因,它总结了赞助商Finch(她欠她自己)TWICE的价值(她欠3.75,但总和函数保持不变返回7.50。总和(a.BALANCE_DUE)列是她赞助的客户应付余额的总正确总数,但Sum(b.BALANCE_DUE)列以某种方式添加了她欠两次的款项。显示的Rush数量是正确的,没有加两次,比如Finch的总和(匆匆也有朋友,但没有欠任何东西,所以只有她的平衡出现了)我想不知怎的,因为Finch欠了一些自己,而她的朋友也欠了,查询是两次总结她的个人金额因为这个,但我只是不明白.....指针是什么?

select b.LAST_NAME, Sum(a.BALANCE_DUE), Sum(b.balance_due)
from CUSTOMER a, CUSTOMER b
where a.SPONSORID = b.CID AND b.BALANCE_DUE is not null 
group by b.LAST_NAME;
                    [ Wrote 4 lines ]
SQL> start q11.sql
LAST_NAME  SUM(A.BALANCE_DUE) SUM(B.BALANCE_DUE)
---------- ------------------ ------------------
Rush                                        8.25
Finch                      30                7.5

另外,如上所述,最终输出需要有一个最后一列,总计基于他们所欠的东西以及赞助人个人所欠的总额(基本上添加列Sum(a.balance_due)和Sum(b) .balance_due)将该输出放在同一输出表中的自己的列中(一个查询)....仍然试图考虑如何执行此操作,查看我的注释......但是聚合函数肯定需要工作首先是正确的。

注意:我知道这是一个ANSI87类型的连接,它是教授的偏好,它是一个巨大的头痛......

无法添加评论:这里是客户表,没有重复项

SQL> select * from customer;

   CID FIRST_NAME LAST_NAME  CATEGORY    SPONSORID BALANCE_DUE
 10001 Rita       Rush       Faculty                      8.25
 10002 Becky      Finch      Faculty                      3.75
 10003 Joyce      Xx_Nestler Friend          10002          20
 10004 Wolf       Xx_Nestler Student                         2
 10005 Vicky      White      Student                       6.3
 10006 John       Kline      Student
 10007 Anya       Rush       Student                       3.5
 10008 Carol      Crane      Friend          10002          10
 10009 Tricia     Tatum      Faculty
 10010 Brian      Price      Student
 10011 Lucy       Nash       Faculty                      1.75
 10012 Larry      Bell       Friend          10001
 10013 Ron        Welsh      Friend          10009

选择了13行。

2 个答案:

答案 0 :(得分:1)

这个怎么样:

select sp.last_name
     , sum(cu.balance_due) as customer_balance
     , sp.balance_due as sponsor_balance
from   customer sp, customer cu
where  cu.sponsorid = sp.cid
and    sp.balance_due is not null 
group by sp.last_name, sp.balance_due;

LAST_NAME  CUSTOMER_BALANCE SPONSOR_BALANCE
---------- ---------------- ---------------
Rush                                   8.25
Finch                    30            3.75

您希望每个赞助商都有一个值,所以不要sum它。

使用ANSI连接时,它看起来像这样:

select sp.last_name
     , sum(cu.balance_due) as customer_balance
     , sp.balance_due as sponsor_balance
from   customer sp
       join customer cu on cu.sponsorid = sp.cid
where  sp.balance_due is not null 
group by sp.last_name, sp.balance_due;

答案 1 :(得分:0)

尝试以下查询以避免重复值

::

另一个选项如下(我要求你使用旧的连接语法)

Select a.last_name,
       (Select sum(b.balance_due)
             From customer b
             Where b.sponsorid = a.cid
       ),
       a.balance_due
From customer a
Where a.balance is not null