如何动态地将行值作为带有摘要信息的标题

时间:2018-04-18 07:26:33

标签: sql oracle plsql oracle12c

我有一个名为EMPLOYEE的表,其中我的列为EMP_NAME,EMP_DOJ(加入日期),如下所示。

EMP_NAME|EMP_DOJ  
Ramesh  |10-jan-2017  
Sandeep |09-jan-2017  
Bhaskar |11-feb-2017  
Jyoti   |12-mar-2017  
Rohan   |12-mar-2017  
Kadali  |11-feb-2018  
Kumari  |12-mar-2018  
Salvi   |12-mar-2018 

我的要求是让明智的员工加入计数,月份和年份应该如下所示。

JAN17_COUNT|FEB17_COUNT|MAR17_COUNT|FEB18_COUNT|MAR18_COUNT  
2          |1          |2          |1          |2 

我尝试使用下面的查询,其中我在PIVOT手动使用月份和年份值,如JAN17,FEB17。

SELECT * 
FROM  ( SELECT TO_CHAR(EMP_DOJ,'MONYY') MONTHYEAR FROM EMPLOYEE ) 
PIVOT ( COUNT(1) CNT FOR MONTHYEAR IN ('JAN17','FEB17') );

在实时情景中,我希望获得所有月份和年份的组合数据,而不是在PIVOT中手动指定

请指导我。

2 个答案:

答案 0 :(得分:0)

如果您下载" AntonsPivoting.zip"在"资源" Lucas Jellema在Dynamic SQL Pivoting – Stealing Anton’s Thunder页面上的部分并在您的架构中运行pivotFun.sql,它会创建一些对象,以及PIVOT功能,可让您动态地执行您的操作即将到来。

例如:

SQL> select * from
  2  table(
  3    pivot('select hd, cnt
  4            from (select to_char(hiredate, ''yyyy.mm'') hd, count(*) cnt
  5                  from emp group by to_char(hiredate, ''yyyy.mm''))'
  6         )
  7       );

   1980.12    1981.02    1981.04    1981.05    1981.06    1981.09    1981.11    1981.12

---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------

         1          2          1          1          1          2          1          2

答案 1 :(得分:0)

您可以创建一个动态CURSOR,使用PIVOT值在IN动态创建的LISTAGG子句中使用,然后使用DBMS_SQL.RETURN_RESULT (Oracle12c +)或PRINT语句返回游标的输出。

DECLARE
v_in_args VARCHAR2(4000);
cur SYS_REFCURSOR;
BEGIN
  SELECT LISTAGG('''' || doj || '''  AS  ' 
                      || doj || '_COUNT', ', ') WITHIN
GROUP (
        ORDER BY TO_DATE(doj,'MONYY')
        ) INTO  v_in_args
FROM (
    SELECT DISTINCT TO_CHAR(EMP_DOJ, 'MONYY') AS doj
      FROM EMPLOYEE
    );

OPEN cur FOR 'SELECT *
FROM (
    SELECT EMP_NAME
        ,TO_CHAR(EMP_DOJ, ''MONYY'') AS DOJ
    FROM EMPLOYEE ORDER BY EMP_DOJ
    )
PIVOT(COUNT(EMP_NAME) FOR DOJ IN ( '||v_in_args||'))';

DBMS_SQL.RETURN_RESULT(cur);
END;
/

PL/SQL procedure successfully completed.

ResultSet #1

JAN17_COUNT FEB17_COUNT MAR17_COUNT FEB18_COUNT MAR18_COUNT
----------- ----------- ----------- ----------- -----------
          2           1           2           1           2

在oracle 11g中,您可以使用相同的块以及引用游标绑定变量。它可以在SQL * Plus或SQL开发人员,Toad中作为脚本运行时使用。

VARIABLE cur REFCURSOR
DECLARE
.. --declaring cursor not needed.
..
OPEN :cur FOR ...
.. 
..  --can't use DBMS_SQL.RETURN_RESULT
END;
/

PRINT x; -- This will give you the result.