【问题标题】:SQL: getting sum from one table, one column, different rowsSQL:从一张表,一列,不同的行中获取总和
【发布时间】:2017-11-29 03:15:01
【问题描述】:

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

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

到目前为止,以下代码(以及运行时的结果)似乎有效,但由于某种原因,它对赞助商 Finch 的价值(她欠自己的)求和 TWICE(她欠 3.75,但 sum 函数保持返回 7.50。Sum(a.BALANCE_DUE) 列是她赞助的客户应付余额的正确合计,但 Sum(b.BALANCE_DUE) 列以某种方式添加了她两次欠款。显示的 Rush 金额是正确的,没有加两次,比如 Finch 的总和(rush 也有朋友,但没有人欠任何东西,所以只有她的余额出现了)我想是因为 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 类型的连接,它是教授的偏好,而且它非常令人头疼.....

无法添加到 cmets:这是客户表,没有重复出现

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 行。

【问题讨论】:

  • 因为你还在学习,所以要养成一个好习惯,使用正确的 JOIN 语法。
  • 这才是症结所在,教授要求项目报告使用HIS FORMATTING PREFERENCE,ANSI87标准,这对全班来说是一个巨大的痛苦,我们中的一些人甚至因为我们想要现代而去找院长, 最新信息。整个学期他都要求 ANSI87 标准,否则我们会失去 10% 的成绩……可笑的恕我直言。他不教任何现代方法,他自制的课堂教科书,虽然更新,但仍然非常过时。
  • 你能发布这个结果的源数据吗?
  • 您必须有重复的记录。运行不带 GROUP BY 的查询。删除 SUM()。看看有没有重复的行。
  • LAST_NAME BALANCE_DUE BALANCE_DUE ---------- ----------- ----------- Rush 8.25 Finch 20 3.75 Finch 10 3.75

标签: sql oracle


【解决方案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;

【讨论】:

  • 抱歉耽搁了,在阅读了这里的一些提示后,我正在自己解决这个问题......我终于能够想出一个类似的解决方案,但仍在总结和得到一个奇怪的结果。不过,这更有意义,并且确实按预期工作。现在我只需要添加一个总计总计的列,我想我可以弄清楚。谢谢!
  • @DragonWolf 对 SO 表示感谢的最佳方式是接受答案;)
【解决方案2】:

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

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

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

select a.last_name, t.sponsor_sum, a.balance_due
from customer a,
(
   Select sponsorid, sum(balance_due) sponsor_sum
   From customer
   group by sponsorid
) t
where a.cid = t.sponsorid

【讨论】:

  • oracle error @ where b.sponsorid .... ORA-00979 不是 GROUP BY 表达式...但我认为嵌套子查询将成为解决方案,尝试一些东西。
  • 我相信外部查询不需要 group by,因为您希望最后一列中的一个人的余额
  • @DragonWolf 立即尝试
猜你喜欢
  • 1970-01-01
  • 2018-12-10
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多