Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle Sql查询一条记录中的报表大数据_Sql_Oracle_Plsql_Pivot - Fatal编程技术网

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

Oracle Sql查询一条记录中的报表大数据,sql,oracle,plsql,pivot,Sql,Oracle,Plsql,Pivot,亲爱的 我需要为每个员工每个日期的交易数量生成报告 每位员工有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,

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

每位员工有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\u 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 ;

如果你提前知道日期,那还不错。但如果不是,SQL语言有一个非常严格的规则,要求您在查询编译时提前知道结果列的数量和类型。只要你能做到这一点,你就可以成功。甚至SELECT*查询也会这样做,因为表定义是已知的,并且是静态的。否则,您必须分三步执行:1)运行查询以获取所需列的信息。2) 使用1中的数据动态构建新的SQL语句,包括所有涉及的安全/风险。3) 从2.hi@MuradTurk运行查询,不客气。如果你认为这是你想要的答案,请接受。