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)