below is the scenario:
(* denotes primary key)
**CompanyUnit**(*Unit_id, unit_loc,Year);
**Employees**(Unit_id,Dept_id,no_of_emp); (unit_id and dept_id are foreign keys)
**ref_department**(*dept_id,dept_name,dept_desc);
sample data:
unit_id unit_loc year
------------------------------------
1 Delhi 2003
2 Mumbai 2004
------------------------------------
dept_id dept_name dept_desc
----------------------------------------
101 ABC ABC-AI
102 ABC ABC-BI
103 ABC ABC-CS
104 XYZ XYZ-Testing
105 XYZ XYZ-Development
----------------------------------------------
unit_id dept_id no_of_emp
----------------------------------------------
1 101 5000
2 102 3000
1 103 4000
1 104 2000
2 105 1000
2 101 3000
----------------------------------------------
Required output: A dynamic view or select:
---------------------------------------------------------------------------
unit_id unit_loc ABC-AI ABC-BI ABC-CS XYZ-Testing XYZ-Development
---------------------------------------------------------------------------
1 Delhi 5000 4000 2000
2 Mumbai 3000 3000 1000
---------------------------------------------------------------------------
The problem is that each new department in ref_department corresponds to a new column in view/select query.
I've written below query:
variable DEPARTMENTS VARCHAR2(100)
BEGIN
:DEPARTMENTS :=NULL;
FOR cur_rec IN (SELECT DISTINCT DEPT_DESC FROM REF_DEPARTMENT) LOOP
:DEPARTMENTS := :DEPARTMENTS || ''''|| cur_rec.DEPT_DESC|| '''' || ',' ;
END LOOP;
dbms_output.put_line(rtrim(:DEPARTMENTS,','));
select * from
(select uid,uloc,uyear, depdesc, emp from
(select C.unit_id as uid, C.unit_loc as uloc,C.year as uyear, E.DEPT_ID as depid,R.DEPT_NAME as depname,R.DEPT_DESC as depdesc,S.NO_OF_EMP as emp
FROM Unit U INNER JOIN Employees E ON U.Unit_id=E.unit_id INNER JOIN REF_DEPARTMENT R ON E.DEPT_ID=R.DEPT_ID))
pivot
(min(emp) for depdesc in (:departments));
END;
error: PL/SQL: ORA-56901: non-constant expression is not allowed for pivot|unpivot
I've referred below links: Pivoting rows into columns dynamically in Oracle; http://www.orafaq.com/forum/t/187172/