我有一个名为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
中手动指定
请指导我。
答案 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.