这是我目前注册的基础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行。
答案 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