oracle - 在 GROUP BY 查询中将值聚合到表类型中

标签 oracle plsql group-by types aggregate-functions

假设您有一个表(在 Oracle 中):

CREATE TABLE CUSTOMER
(
  customer_id NUMBER,
  gender      CHAR(1)
);

假设您有一个表类型:

CREATE TYPE NUMBER_TABLE_TYPE AS TABLE OF NUMBER;

是否可以编写一个 GROUP BY 查询,以便对于每个组,该组的主键字段都存储在 NUMBER_TABLE_TYPE 中?例如:

DECLARE
  CURSOR gender_cursor IS
    SELECT
      gender,
      /* The CUSTOMER_IDS column will be of type NUMBER_TABLE_TYPE: */
      SOME_MAGICAL_AGGREGATE_FUNCTION(customer_id) AS customer_ids
    FROM
      CUSTOMER
    GROUP BY
      gender;

  customer_ids NUMBER_TABLE_TYPE;
BEGIN
  FOR gender IN gender_cursor LOOP
    customer_ids := gender.customer_ids;
    FOR i IN customer_ids.FIRST .. customer_ids.LAST LOOP
      dbms_output.put_line(customer_ids(i));
    END LOOP;
  END LOOP;
END;

我知道这应该通过使用两个游标来完成(一个用于性别组,另一个用于查询每个组的客户)。我只是好奇这是否可以做到。 :)

最佳答案

有两种方法可以实现这一点。 首先,通过分析来获取每行上该性别的所有记录的计数。

DECLARE
  CURSOR gender_cursor IS
    SELECT gender, customer_id, count(*) over (partition by gender) cnt_in_gender,
    FROM   CUSTOMER
    ORDER BY gender;
  v_prev_gender varchar2(1) := '?';
BEGIN
  FOR gender IN gender_cursor LOOP
      IF gender.gender != v_prev gender then
        dbms_output.put_line('You will now see '||gender.cnt_in_gender);
        v_prev_gender := gender.gender);
      END IF;
      dbms_output.put_line(gender.customer_ids);
  END LOOP;
END;

其次,更接近您的要求

DECLARE
  CURSOR gender_cursor IS
    SELECT
      gender,
      /* The CUSTOMER_IDS column will be of type NUMBER_TABLE_TYPE: */
      CAST(COLLECT(customer_id) AS NUMBER_TABLE_TYPE) AS customer_ids
    FROM
      CUSTOMER
    GROUP BY
      gender;

  customer_ids NUMBER_TABLE_TYPE;
BEGIN
  FOR gender IN gender_cursor LOOP
    customer_ids := gender.customer_ids;
    FOR i IN customer_ids.FIRST .. customer_ids.LAST LOOP
      dbms_output.put_line(customer_ids(i));
    END LOOP;
  END LOOP;
END;

关于oracle - 在 GROUP BY 查询中将值聚合到表类型中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3367579/

相关文章:

python - Pandas parallel groupBy 消耗大量内存

mysql - 如何将相同类型的值分组为共同值并按该值分组

c# - 是否无法在运行时或编译时更改 SSDL 内容(Visual Studio 2015 EntityFramework 数据库首先使用 Oracle)

sql - 在 Oracle SQL 查询的结果中包含列名?

在联合中使用时,Oracle 流水线函数无法访问远程表 (ORA-12840)

Oracle PL/SQL 匿名 block 从两个表检索数据(NOVA 环境)

java - Spring JDBC - 将 BLOB 数组传递给 SQL 函数

Ubuntu 18.04 上的 Oracle 12.1.0 - 调用目标时出错 '' 链接 proc gen_pcscfg procob '' of makefile ' '<oraclehome>/precomp/lib/ins_precomp.mk''

oracle - 在 Oracle 中使用多个可能的掩码转换为日期

python-2.7 - 分组后在python中的双重排名