【问题标题】:Parent and Child Total in Oracle SQLOracle SQL 中的父子总计
【发布时间】:2023-01-17 06:12:01
【问题描述】:

我正在寻找 Child 到 Parent 的总计

虽然我能够得到孩子总数,但任何人都可以协助以下相同的是

CODE PARENT CHLD TERM_LOAN_TOTAL1
40100 : AGRICULTURE Required values 11565000
40110 : Crop Production
40120 : Poultry and livestock 11565000
40130 : Fishing
40140 : Plantation
40150 : Agro Services
40160 : Cash Crop
40200 : MINING AND QUARRYING

这是我的 SQL 查询:

select cdd, prnt, chld, term_loan_total1
 from (SELECT x.mis_code cdd,
               CASE
                 WHEN x.mis_code LIKE '%00' THEN
                  to_char(lpad(nvl(x.mis_code, 0), 5, ':') || '   :  ' ||
                          x.code_desc)
               END prnt,
               CASE
                 WHEN x.mis_code NOT LIKE '%00' THEN
                  to_char(lpad(nvl(x.mis_code, 0), 5, ':') || '   :  ' ||
                          x.code_desc)
               END chld,
               
               (select sum(ct.amount_disbursed)
                  from cltb_account_master ct
                  left join mitm_customer_default mic
                    on ct.customer_id = mic.customer
                  left join gltm_mis_code msc
                    on mic.cust_mis_2 = msc.mis_code
                 where ct.product_code not in ('SBAD')
                   and msc.mis_code = x.mis_code) term_loan_total1
           FROM gltm_mis_code x
         WHERE mis_class in ('CBN_SUBS', 'CBN_SECT')
         group by x.mis_code, x.code_desc
         order by x.mis_code)
 group by cdd, prnt, chld, term_loan_total1
 order by cdd

附上两个表的CRUD脚本

-- Create table
create table CLTTBL
(
  account_number   VARCHAR2(35),
  amount_disbursed NUMBER
)
tablespace test
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
  
  
  prompt Importing table clttbl...
set feedback off
set define off
insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221390016', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221500006', 85000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221430007', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221390011', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221390012', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221500003', 80000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221430004', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221390003', 10000000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221430003', 80000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221390010', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221390019', 85000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221430002', 50000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221400002', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221390004', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221390017', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221390018', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221430006', 100000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('001SBTL221400001', 85000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('000SBTL222130004', 10000000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('000SBTL221390001', 5000000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('000SBTL221390003', 10000000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('000SBTL221390007', 10000000);

insert into clttbl (ACCOUNT_NUMBER, AMOUNT_DISBURSED)
values ('000SBTL222130003', 5000000);

prompt Done.

MIS 表插入

create table gltm_mis_cd
(
  PRNT   VARCHAR2(35),
  CHLD VARCHAR2(35),
  CODE_DESC VARCHAR2(35),
)
tablespace test
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );


prompt Importing table gltm_mis_cd...
set feedback off
set define off
insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values ('40100   :  AGRICULTURE', null, 'AGRICULTURE');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values (null, '40110   :  Crop Production', 'Crop Production');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values (null, '40120   :  Poultry and livestock', 'Poultry and livestock');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values (null, '40130   :  Fishing', 'Fishing');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values (null, '40140   :  Plantation', 'Plantation');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values (null, '40150   :  Agro Services', 'Agro Services');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values (null, '40160   :  Cash Crop', 'Cash Crop');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values ('40200   :  MINING AND QUARRYING', null, 'MINING AND QUARRYING');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values (null, '40210   :  Metal: Tin, Iron, etc', 'Metal: Tin, Iron, etc');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values (null, '40220   :  Non-metal Quarrying', 'Non-metal Quarrying');

insert into gltm_mis_cd (PRNT, CHLD, CODE_DESC)
values (null, '40230   :  Others', 'Others');

提示完成。

parent Total

【问题讨论】:

  • edit 将问题包含在minimal reproducible example 中:CREATE TABLE 表的语句;生成输出的示例数据的 INSERT 语句;您尝试实现的逻辑的详细说明。
  • 我完全同意你的建议,但是 SQL 中的一些表,数据量很大,提取的数据结构本质上很大,这些是上述请求面临的限制谢谢你的建议但是会努力提取同样的问候
  • 这就是为什么我说 minimal reproducible example - 重点是最小 - 您可以从表中删除所有不必要的列,只包含几行数据。如果你不能给我们一个复制问题的方法,那么你希望我们如何回答这个问题?
  • 当然,先生,我可以理解我准备好为我的数据库提供远程服务的要求,如果有人愿意参与远程服务,我可以提供 Ultraviewer 访问权限,让我知道那里的个人邮件 ID,我将通过邮件亲自联系
  • 不是这样做(这对您的数据库来说可能是一个巨大的安全问题,并且您也在隐式请求其他用户的电子邮件)。只需努力在您的问题中提供minimal reproducible example

标签: sql oracle


【解决方案1】:

这个问题中缺少很多东西来给出 excat 答案,但也许(与所有其他表和它们之间的链接)你只需要 CASE 表达式来解决问题。以下只是您可以使用它的多种方式之一的示例。
https://www.oracletutorial.com/oracle-basics/oracle-case/ 上有更多关于 CASE 表达式的例子
要完成您的工作,您应该添加自己的表和连接,并调整 WHERE、GROUP BY 和 ORDER BY 子句。最重要的是编写自己的 CASE 表达式。在此示例中,我使用固定值,因为没有来自其他表的示例数据。希望你能通过这个在正确的方向上得到一点推动......

Select
    SubStr(Nvl(g.PRNT, g.CHLD), 1, 5) "CDD",
    g.PRNT "PRNT",
    g.CHLD "CHLD",
    Sum(CASE WHEN Nvl(SubStr(g.CHLD, 1, 5), '40120') = '40120' THEN c.AMOUNT_DISBURSED END) "TERM_LOAN_TOTAL_1"
From
    GLTM_MIS_CD g
Inner Join
    CLTTBL c ON(1=1 And SubStr(c.ACCOUNT_NUMBER, 1, 3) = '001')
Where
    SubStr(Nvl(g.PRNT, g.CHLD), 1, 3) = '401'
Group By
    SubStr(Nvl(g.PRNT, g.CHLD), 1, 5),
    g.PRNT,
    g.CHLD
Order By
    SubStr(Nvl(g.PRNT, g.CHLD), 1, 5)

结果

CDD PRNT CHLD TERM_LOAN_TOTAL_1
40100 40100 : AGRICULTURE 11565000
40110 40110 : Crop Production
40120 40120 : Poultry and livestock 11565000
40130 40130 : Fishing
40140 40140 : Plantation
40150 40150 : Agro Services
40160 40160 : Cash Crop

问候...

【讨论】:

    猜你喜欢
    • 2022-11-25
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2022-01-06
    • 2019-04-28
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多