微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Oracle Sql查询报表一次记录大数据

如何解决Oracle Sql查询报表一次记录大数据

亲爱的 我需要针对每个员工每个日期的交易次数生成报告

每位员工都有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

我如何编写这样的查询

解决方法

您可以使用条件聚合,例如

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 ;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。