Oracle Sql 查询一条记录大数据中的报表

Posted

技术标签:

【中文标题】Oracle Sql 查询一条记录大数据中的报表【英文标题】:Oracle Sql query for report in one record large data 【发布时间】:2020-10-16 18:04:43 【问题描述】:

亲爱的 我需要为每个员工每个日期的交易数量生成报告

每个员工有 10 条记录,每条记录包括当天的第 9f 笔交易

Emp1  16/10/2020  50
Emp1  15/10/2020  30
Emp1  14/10/2020  70

我需要查询以在一条记录中返回此数据

Emp  14/10  15/10  16/10 
___  _____  _____  _____
Emp1  70      30     50

我该如何编写这样的查询?

【问题讨论】:

如果你提前知道几天,那还不错。但如果没有,SQL 语言有一个非常严格的规则,要求您在查询编译时提前知道结果列的数量和类型。只要你能做到这一点,你就能以你的方式走向成功。甚至 SELECT * 查询也会这样做,因为表定义是已知的并且足够静态。否则,您必须分三个步骤完成:1) 运行查询以获取有关您需要哪些列的信息。 2) 使用 1 中的数据动态构建新的 SQL 语句,其中涉及所有安全/风险。 3) 从 2 运行查询。 【参考方案1】:

你可以使用条件聚合比如

SELECT Employee, SUM(CASE WHEN day = date'2020-10-14' THEN 1 ELSE 0 END) AS "14/10",
                 SUM(CASE WHEN day = date'2020-10-15' THEN 1 ELSE 0 END) AS "15/10",
                 SUM(CASE WHEN day = date'2020-10-16' THEN 1 ELSE 0 END) AS "16/10"
  FROM t
 GROUP BY Employee

PIVOT子句如

SELECT Employee, SUM("14/10") AS "14/10", 
                 SUM("15/10") AS "15/10", 
                 SUM("16/10") AS "16/10"
  FROM t
 PIVOT 
 (
  COUNT(*) FOR day IN (date'2020-10-14' AS "14/10",
                       date'2020-10-15' AS "15/10",
                       date'2020-10-16' AS "16/10") 
 )
 GROUP BY Employee

为了以静态方式旋转您的结果,例如,在这两种情况下,您都必须将所有列添加到查询中,无论需要哪个日期值。相反,您可以使用包含SYS_REFCURSOR 的函数,例如

CREATE OR REPLACE FUNCTION Get_Transactions_RS RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767);
  v_cols      VARCHAR2(32767);  
BEGIN

  SELECT LISTAGG( 'SUM(CASE WHEN day = '''||day||''' 
                            THEN 1 ELSE 0 
                        END) AS "'||TO_CHAR(day,'dd/mm')||'"' , ',' )
          WITHIN GROUP ( ORDER BY day )
    INTO v_cols
    FROM (
          SELECT DISTINCT day
            FROM t
          );

  v_sql :=
  'SELECT Employee, '|| v_cols ||'
     FROM t
    GROUP BY Employee'; 

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;
/

然后从 SQL Developer 的控制台调用,以返回每天旋转的事务数:

SQL> DECLARE
    v_transactions SYS_REFCURSOR;
BEGIN
   :v_transactions := Get_Transactions_RS;
END;
/

SQL> PRINT v_transactions ;

【讨论】:

嗨@MuradTurk,不客气。如果您认为这是您想要的答案,欢迎您接受。

以上是关于Oracle Sql 查询一条记录大数据中的报表的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE分组排序查询

oracle数据库查询去除重复的记录,保留其中的某一条

ORACLE大数据表Update处理

Oracle取查询结果数据的第一条记录SQL

Oracle 数据量非常大(上亿)时,使用存储过程中的游标返回分页查询的10条记录非常耗时,请问如何优化?

SQL Server 如何查询最后一条记录