Oracle表中多个组的列的总和值

Posted

技术标签:

【中文标题】Oracle表中多个组的列的总和值【英文标题】:Sum values of columns for multiple groups in Oracle table 【发布时间】:2020-04-08 15:50:33 【问题描述】:

我有一张表格,上面列出了人员、性别、种族和他们的群体。它有 2000 条记录,分为 8 组。我正在尝试使用 PL/SQL 来获取每个组的每个种族每个性别的人数总和。我在想我应该有一个游标用 8 个组填充一个名为 v_group 的变量,然后遍历所有记录并获取每个记录的计数。它将每个计数放入自己的变量中,然后将新的汇总计数和相应的组插入到表中。

这是我目前所拥有的示例。

OPEN cur_get_group;     
LOOP
    v_group := '';
    FETCH cur_get_group
       INTO v_group;
    EXIT WHEN cur_get_group%NOTFOUND;

    SELECT COUNT(*) INTO v_hisp_m FROM mytable WHERE sex = 'M' AND ethn_code = 'H';
    SELECT COUNT(*) INTO v_hisp_f FROM mytable WHERE sex = 'F' AND ethn_code = 'H';
    SELECT COUNT(*) INTO v_cauc_m FROM mytable WHERE sex = 'M' AND ethn_code = 'C';
    SELECT COUNT(*) INTO v_cauc_f FROM mytable WHERE sex = 'F' AND ethn_code = 'C';

    INSERT INTO mynewtable
    (group, hisp_m, hisp_f, cauc_m, cauc_f)
    VALUES
    (v_group, v_hisp_m, v_hisp_f, v_cauc_m, v_cauc_f);
    COMMIT;            

END LOOP;   

我在正确的轨道上吗?我需要以不同的方式进行循环吗?

【问题讨论】:

所以你在每个组的记录中输入了相同的个计数值,这是你想要的吗? 【参考方案1】:

关系数据库在数据匹配条件集上工作并且非常擅长。然而,它们的单项处理能力非常差。学会思考是套话。您的进程必须通过源数据表 5 次(1 次用于组和计数进程)虽然循环有时是必要的邪恶,但它们是最后的处理。这可以在 1 条语句中完成,传递源 1 次。

insert into mynewtable
     (group, hisp_m, hisp_f, cauc_m, cauc_f)

select group_code
     ,  sum(hisp_m)
     ,  sum(hisp_f)
     ,  sum(cauc_m)     
     ,  sum(cauc_f)  
  from    
       ( select group_code,
              , case when sex = 'F' AND ethn_code = 'H' then 1 else 0 end hisp_f
              , case when sex = 'M' AND ethn_code = 'H' then 1 else 0 end hisp_m
              , case when sex = 'F' AND ethn_code = 'C' then 1 else 0 end cauc_f              
              , case when sex = 'M' AND ethn_code = 'C' then 1 else 0 end cauc_m
           from youroldtable
        )
group by group_code; 

顺便说一句,不要使用组作为列名。这是一个保留字,这样做会导致很难发现错误。

【讨论】:

【参考方案2】:

在我看来你想使用pivot

with rws as (
  select 'F' sex, 'H' eth from dual connect by level <= 3
  union all
  select 'F' sex, 'C' eth from dual connect by level <= 4
  union all
  select 'M' sex, 'H' eth from dual connect by level <= 2
  union all
  select 'M' sex, 'C' eth from dual
) 
  select * from rws
  pivot (
    count (*) for ( sex, eth ) in (
      ( 'F', 'H' ) fh,
      ( 'F', 'C' ) fc,
      ( 'M', 'H' ) mh,
      ( 'M', 'C' ) mc
    )
  );

FH    FC    MH    MC   
    3     4     2     1 

并将这个查询的结果插入到表中。

【讨论】:

我在哪里从 mytable 获取值? 用你的表替换rws

以上是关于Oracle表中多个组的列的总和值的主要内容,如果未能解决你的问题,请参考以下文章

SQL从日期范围内的同一表中的不同记录中获取多个项目的总和(ORACLE)

Oracle过程增加字符串数据类型并将其存储为表中的列之一

Oracle SQL - 重复行并更新表中的列

Oracle 19C学习

Toad 问题:Oracle 类型作为显示所有记录的表中列的数据类型

Oracle SQL:根据在另一个表中给定条件的列中找到的值插入