【问题标题】:Pl/Sql Approach to write complex procedure Best PracticesPl/Sql 编写复杂过程的方法最佳实践
【发布时间】:2015-11-05 12:03:07
【问题描述】:

我对 Pl Sql 比较陌生,必须编写一个执行以下操作的程序,它有 6-7 个不同的查询,如下所示:

Select manager, count(*) bank from abc ..........

从 abc 中选择经理,count(*) 零售......

现在每个计数是针对不同部门的,而经理可能是相同的。所以问题是我正在寻找一种可以帮助我存储的最佳方法 单独表格中的数据具有以下结构:

经理:计数银行:计数零售:计数 xyz ......

如何使用 Pl sql 确保每个经理对所有列都有正确的计数(bank/retai/xyz),第一件事是如何存储多个不同的查询结果并进行处理。我认为我们可以使用游标,但我需要对其进行研究,而且这个程序应该是高性能的。 请提出建议。

谢谢 XslGuy

【问题讨论】:

  • 在我看来就像学校的作业。

标签: oracle stored-procedures plsql


【解决方案1】:

这很容易通过条件和来实现。希望以下内容能让您充分了解您需要做什么:

with sample_data as (select 1 id, 1 dept, 10 val from dual union all
                     select 2 id, 1 dept, 20 val from dual union all
                     select 3 id, 2 dept, 30 val from dual union all
                     select 4 id, 3 dept, 40 val from dual union all
                     select 5 id, 1 dept, 50 val from dual union all
                     select 6 id, 3 dept, 60 val from dual union all
                     select 7 id, 2 dept, 70 val from dual union all
                     select 8 id, 4 dept, 80 val from dual)
-- end of creating a subquery that contains some sample data. See sql below:
select sum(case when dept = 1 then val end) dept_1_total,
       sum(case when dept = 2 then val end) dept_2_total,
       sum(case when dept = 3 then val end) dept_3_total
from   sample_data
where  dept in (1, 2, 3);

DEPT_1_TOTAL DEPT_2_TOTAL DEPT_3_TOTAL
------------ ------------ ------------
          80          100          100

【讨论】:

  • ... 或使用常规 group by dept 循环通过常规光标。
  • @nop77svk 虽然标准的 group by 查询会给出总数,但它会将它们作为行而不是列给出。由于 OP 想要插入到一个表中,其中不同的部门计数存储为单独的列,因此按查询分组需要额外的工作才能将结果转换为正确的格式。当您可以只进行条件求和并直接以格式获取结果时,何必费心呢?
  • 如果您按id分组,我认为它会更适合OP。
  • @MatthewMcPeak 在这种情况下按 id 分组将毫无意义,因为它是“唯一的”。这并不意味着是一个完整的解决方案 - 它意味着让 OP 了解如何进行条件聚合。大概 OP 明白,如果他们需要按特定列分组,他们需要添加 group by 子句,或者如果他们正在计算单个经理的结果,他们只需添加 where manager = ...查询的谓词。
  • 对不起。我没有仔细看——第一眼我认为id 应该是经理 ID——遵循 OP 的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2017-09-21
  • 2019-05-09
  • 2011-03-19
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多