在Is the following query possible with SQL Pivot?上查看我的回答
当您的数据被透视并且列是动态的时,您可以使用以下设置。你无法逃避一些plsql。
示例表和数据:
CREATE TABLE DEMO_LOCATIONS (
ID NUMBER(10)
, NAME VARCHAR2(20)
, CONSTRAINT LOCATION_PK PRIMARY KEY (ID)
);
CREATE TABLE DEMO_DEPARTMENTS (
ID NUMBER(10)
, LOCATION_ID NUMBER(10)
, NAME VARCHAR2(20)
, CONSTRAINT DEPARTMENT_PK PRIMARY KEY (ID)
, CONSTRAINT DEPT_LOC_FK FOREIGN KEY (LOCATION_ID) REFERENCES DEMO_LOCATIONS (ID)
);
CREATE TABLE DEMO_EMPLOYEES (
ID NUMBER(10)
, DEPARTMENT_ID NUMBER(10)
, NAME VARCHAR2(20)
, CONSTRAINT EMPLOYEES_PK PRIMARY KEY (ID)
, CONSTRAINT EMPL_DEPT_FK FOREIGN KEY (DEPARTMENT_ID) REFERENCES DEMO_DEPARTMENTS (ID)
);
DECLARE
l_emp_id NUMBER := 0;
BEGIN
INSERT INTO demo_locations (id, name) VALUES (1, 'Paris');
INSERT INTO demo_locations (id, name) VALUES (2, 'Rome');
INSERT INTO demo_locations (id, name) VALUES (3, 'London');
INSERT INTO
INSERT INTO demo_departments(id, location_id, name) VALUES (1, 1, 'A');
INSERT INTO demo_departments(id, location_id, name) VALUES (2, 1, 'B');
INSERT INTO demo_departments(id, location_id, name) VALUES (3, 1, 'C');
INSERT INTO demo_departments(id, location_id, name) VALUES (4, 2, 'A');
INSERT INTO demo_departments(id, location_id, name) VALUES (5, 2, 'B');
INSERT INTO demo_departments(id, location_id, name) VALUES (6, 2, 'C');
INSERT INTO demo_departments(id, location_id, name) VALUES (7, 3, 'A');
INSERT INTO demo_departments(id, location_id, name) VALUES (8, 3, 'B');
INSERT INTO demo_departments(id, location_id, name) VALUES (9, 3, 'C');
FOR I IN 1..9 LOOP
FOR J IN 1..FLOOR(DBMS_RANDOM.VALUE(1,10)) LOOP
l_emp_id := l_emp_id + 1;
INSERT INTO demo_employees (id, department_id, name) VALUES (l_emp_id, i, 'employee #'||j);
END LOOP;
END LOOP;
END;
/
COMMIT;
WITH pivot_src AS (
SELECT l.name location_name, d.name department_name, count(*) amount_employees
FROM demo_locations l
JOIN demo_departments d
ON d.location_id = l.id
JOIN demo_employees e
ON e.department_id = d.id
GROUP BY l.name, d.name
)
SELECT *
FROM pivot_src
pivot ( sum(amount_employees) as all_emps for department_name in ('A' as "Department A", 'B' as "Department B", 'C' as "Department C") );
顶点
报告来源:
DECLARE
l_pivot_cols VARCHAR2(4000);
l_pivot_qry VARCHAR2(4000);
BEGIN
IF NVL(:PX_DEPTA, 'N') = 'Y' THEN
l_pivot_cols := l_pivot_cols || '''A'' as "Department A",';
END IF;
IF NVL(:PX_DEPTB, 'N') = 'Y' THEN
l_pivot_cols := l_pivot_cols || '''B'' as "Department B",';
END IF;
IF NVL(:PX_DEPTC, 'N') = 'Y' THEN
l_pivot_cols := l_pivot_cols || '''C'' as "Department C",';
END IF;
l_pivot_cols := RTRIM(l_pivot_cols, ',');
l_pivot_qry :=
' WITH pivot_src AS ( '
|| ' SELECT l.name location_name, d.name department_name, count(*) amount_employees '
|| ' FROM demo_locations l '
|| ' JOIN demo_departments d '
|| ' ON d.location_id = l.id '
|| ' JOIN demo_employees e '
|| ' ON e.department_id = d.id '
|| ' GROUP BY l.name, d.name '
|| ' ) '
|| ' SELECT * '
|| ' FROM pivot_src '
|| ' pivot ( sum(amount_employees) as all_emps for department_name in ('||l_pivot_cols||') ); ';
RETURN l_pivot_qry;
END;
报告属性 > PLSQL 标题
DECLARE
l_cols VARCHAR2(4000);
BEGIN
l_cols := 'Location:';
IF :PX_DEPTA = 'Y' THEN
l_cols := l_cols || 'Department A:';
END IF;
IF :PX_DEPTB = 'Y' THEN
l_cols := l_cols || 'Department B:';
END IF;
IF :PX_DEPTC = 'Y' THEN
l_cols := l_cols || 'Department C:';
END IF;
RETURN RTRIM(l_cols, ':');
END;
制作3个复选框,默认Y,LOV:STATIC2:;Y。将项目添加到报告“要提交的页面项目”中。创建一个在项目更改时触发并刷新报告的动态操作。