【问题标题】:Sum of distinc rows after a 1-many table join1-many table join 后不同行的总和
【发布时间】:2012-11-14 12:14:05
【问题描述】:

我有 2 个要加入的表。

表 1 与表 2 具有一对多关系。也就是说,表 2 可以为表 1 的单行返回多行。因此,表 1 的记录与表上的行数一样多2.. 这是预期的。

现在,我对表 1 中的一列进行了求和,但是由于在连接中返回了多行,因此总和显然是相乘的。

有没有办法让这个号码恢复到原来的号码?我尝试除以表 2 中的行数,但这并没有给我预期的结果。是否有任何分析功能可以做到这一点?我几乎想要类似的东西 "如果此行尚未计入总和,则将其添加到总和中"

【问题讨论】:

  • 表结构、查询、示例数据和所需结果会很方便。
  • @Lock:你在什么基础上求和,如果table1和table2中存在一对多关系,因为表1中的每一行都是不同的。用这个数据解释这个sqlfiddle.com/#!4/228ea/2跨度>

标签: sql oracle join sum


【解决方案1】:

可能有一种更优化的方式来做到这一点,即使我对我现在为您提供的解决方案不满意,但暂时这对您有用。让其他大师开放:)

create table table1(id number,val number);
create table table2(id number,name varchar2(200));

insert into table1 values(1,1);
insert into table1 values(2,2);
insert into table1 values(3,3);

insert into table2 values(1,'gaurav');
insert into table2 values(1,'saurav');
insert into table2 values(1,'paurav');

insert into table2 values(2,'Rohan');
insert into table2 values(2,'Bhasker');
insert into table2 values(2,'Garima');


WITH tab as
(
SELECT id,sum(val) over() sum
FROM(
select DISTINCT t1.id,t1.val
from table1 t1,table2 t2 where t1.id=t2.id
))
SELECT tab.id,t2.id,t2.name,tab.sum
FROM table2 t2,tab
WHERE t2.id=tab.id

SQLFIDDLE:link

【讨论】:

    【解决方案2】:

    如果没有示例结构/数据所需的结果等,很难确切知道,但这可能是您所追求的:

    Select
      s.t1Sum,
      t1.*,
      t2.*
    From (
        Select
          sum(col1) as t1Sum
        From
          Table1
        ) s
        Cross Join
      Table1 t1
        Inner Join
      Table2 t2
        On t1.Id = t2.FkId
    

    【讨论】:

    • :我认为这行不通,因为据我了解,sum 将是与 table2 匹配的 id。在您的情况下,您正在做整个 table1 col1 的总和,这可能不会工作。即使我不确定要求,但可能我的理解是正确的。如果我错了,对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多