【问题标题】:How to calculate oracle column data with group by如何使用 group by 计算 oracle 列数据
【发布时间】:2019-11-09 11:09:21
【问题描述】:

我想从不同的表中计算不同的列。 我正在尝试从我的代码中获得所需的结果,但结果 给我两次相同的数据行

我的 oracle 数据库中有 3 个表 rolls_purchase,rolls_issue,rolls_consumption

CREATE TABLE ROLLS_purchase(
V_ID INT,
ENT_DATE DATE,
ENT_TIME DATE,
QUALITY VARCHAR2(25),
ROLL_QTY INT,
ROLL_SIZE INT);

CREATE TABLE ROLLS_ISSUE(
V_ID INT,
ISSUE_DATE DATE,
ISSUE_TIME DATE,
QUALITY VARCHAR2(25),
ROLL_SIZE INT,
ROLL_QTY INT,
TO_PO VARCHAR2(100)
);

CREATE TABLE ROLLS_consumption(
V_ID INT,
ISSUE_DATE DATE,
ISSUE_TIME DATE,
QUALITY VARCHAR2(25),
ROLL_SIZE INT,
ROLL_QTY INT,
ROLL_USED INT,
LEFT_ROLL INT
);

当我购买卷并将数据放入我的rolls_purchase 表时,我得到了结果 正确,之后我使用rolls_issue 表单进行问题滚动,然后我的表单编码做得很好,第三步是当用户使用滚动时,如果有剩余并返回给我,我需要在使用时将它们添加回来代码然后结果给了我两次相同的行,如下所示。

select x.quality,x.roll_size,sum(x.roll_qty)as 
"TOTAL_ROLL",NVL(SUM(I.ROLL_QTY),0)
from rolls x, rolls_issue I
where x.quality is not null
group by x.quality,x.roll_size,I.ROLL_QTY,I.QUALITY;

以上代码结果为

        quality           size  t.roll    used
 FLOUTING 100 GSM         44    150       40
 FLOUTING 100 GSM         44    150      20
 FLOUTING 125 GSM         36    50        40

我需要这个结果,如果发出我的卷然后上面的代码计算我的卷组并将它们相加只有一行,如下所示

     quality           size  t.roll    used
 FLOUTING 100 GSM         44    150       60
 FLOUTING 125 GSM         36    50        40

【问题讨论】:

  • 我在 rolls_purchaserolls_issue 之间看不到要在联接条件中使用的公共列。 rolls 的意思是 rolls_purchase 吗?

标签: sql oracle group-by


【解决方案1】:

在分组子句中仅使用p.quality,p.roll_size(我只是将别名x 替换为p

将这样的查询与 join 结合使用:

select p.quality, p.roll_size,
       sum(p.roll_qty) as "Total Roll", nvl(sum(i.roll_qty), 0) as "Total Used"
  from rolls_purchased p
  join rolls_issue i
    on p.issue_id = i.v_id
 where p.quality is not null
 group by p.quality, p.roll_size 

【讨论】:

    【解决方案2】:

    如果我理解正确,group byjoining 之前:

    select quality, roll_size, r.total_roll,
           coalesce(ri.total_issue, 0)
    from (select r.quality, r.roll_size, sum(r.qty) as total_roll
          from rolls r
          group by r.quality, r.roll_size
         ) left join
         (select ri.quality, ri.roll_size, sum(ri.qty) as total_issue
          from rolls_issue ri
          group by ri.quality, ri.roll_size
         ) ri
         using (quality, roll_size)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2019-05-17
      相关资源
      最近更新 更多