Понедельник, 30.12.2024, 22:06

  • Полезные Скрипты Oracle
Главная Книги Быстрый Поиск О Сайте

Oracle
PL/SQL
Решения для Oracle
ПОИСК
Быстрый поиск
 Pivot
Использование PIVOT отметка в SQL (Oracle 11g)

PIVOT берёт данные из строк, аггрегирует их и возвращает в виде столбцов, то есть, строит сводную таблицу.


Начальный запрос имеет следующий вид :
Select e.job_id  , e.department_id , SUM(e.salary) sum_s  
From hr.employees e

Group by  e.job_id , e.department_id 
Order by  e.job_id , e.department_id;

Результат:
JOB_IDDEPARTMENT_IDSUM_S
AC_ACCOUNT1108300
AC_MGR11012008
AD_ASST104400
AD_PRES9024000
AD_VP9034000
FI_ACCOUNT10039600
FI_MGR10012008
HR_REP406500
IT_PROG6028800
MK_MAN2013000
MK_REP206000
PR_REP7010000
PU_CLERK3013900
PU_MAN3011000
SA_MAN8061000
SA_REP80243500
SA_REP 7000
SH_CLERK5064300
ST_CLERK5055700
ST_MAN5036400



А теперь используем отметку PIVOT,чтобы получить суммарную зарплату каждой job_id для departent_id (10,20,30,40):
SELECT * FROM
      (SELECT e.department_id , e.job_id ,e.salary FROM   hr.employees e) pivot_data
PIVOT ( SUM(salary) FOR department_id IN  (10,20,30,40));

Или  

WITH 
   pivot_data as (SELECT e.department_id , e.job_id ,e.salary FROM   hr.employees e)
  
  
SELECT * FROM pivot_data 
  
PIVOT SUM(salary) FOR department_id IN  (10,20,30,40));
Результат:

JOB_ID10203040
IT_PROG    
AC_MGR    
AC_ACCOUNT    
ST_MAN    
PU_MAN  11000 
AD_ASST4400   
AD_VP    
SH_CLERK    
FI_ACCOUNT    
FI_MGR    
PU_CLERK  13900 
SA_MAN    
MK_MAN 13000  
PR_REP    
AD_PRES    
SA_REP    
MK_REP 6000  
ST_CLERK    
HR_REP   6500

Тот же результат без отметки PIVOT :
SELECT  e.job_id,
 (SELECT sum(d1.salary) FROM hr.employees d1 WHERE  d1.department_id =10 AND d1.job_id=e.job_id
GROUP BY d1.department_id) "10",
 (SELECT sum(d2.salary) FROM hr.employees d2 WHERE  d2.department_id =20 AND d2.job_id=e.job_id
GROUP BY d2.department_id) "20",
  (SELECT sum(d3.salary) FROM hr.employees d3 WHERE  d3.department_id =30 AND d3.job_id=e.job_id
GROUP BY d3.department_id) "30",
  (SELECT sum(d4.salary) FROM hr.employees d4 WHERE  d4.department_id =40 AND d4.job_id=e.job_id
GROUP BY d4.department_id) "40"
FROM   hr.employees e GROUP BY  e.job_id







Copyright sql.ucoz.com © 2024
Оцените сайт

Всего ответов: 52