Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एकाधिक कॉलम समूह के साथ Oracle आधारित PIVOT

आप एक निश्चित मान पर पिवट कर रहे हैं, स्ट्रिंग शाब्दिक 'RM' , इसलिए आप वास्तव में पिवट में कुछ भी उपयोगी नहीं कर रहे हैं - आउटपुट वही है जो आपको 'pivot_data' क्वेरी को स्वयं चलाने से प्राप्त होगा:

SELECT eNAME,workhrs,room, SCR from PRODUCTIVITY p,PRODUCTIVITYd d, emp e, ROOMS R
where p.PRODUCTIVITYID=d.PRODUCTIVITYID and e.empno=p.employeeid
AND R.ID=P.ROOMID;

ENAME    WORKHRS       ROOM        SCR
----- ---------- ---------- ----------
JONES        3.6        101         53
ALLEN       1.32        101         43
ALLEN          6        102         22

आप कुल workhrs . चाहते हैं प्रत्येक कर्मचारी के लिए, और उनके द्वारा बेचे गए कमरों की एक धुरी। यदि आप workhrs . का विश्लेषणात्मक योग प्राप्त करने के लिए उस क्वेरी को बदलते हैं और रूम/स्क्रैच मानों की रैंकिंग (और आधुनिक जॉइन सिंटैक्स का उपयोग करके) आपको मिलती है:

select e.ename, r.room, p.scr,
  sum(d.workhrs) over (partition by e.ename) as wrkhrs,
  rank() over (partition by e.ename order by r.room, p.scr) as rnk
from productivity p
join productivityd d on d.productivityid = p.productivityid
join emp e on e.empno=p.employeeid
join rooms r on r.id = p.roomid;

ENAME       ROOM        SCR     WRKHRS        RNK
----- ---------- ---------- ---------- ----------
ALLEN        101         43       7.32          1
ALLEN        102         22       7.32          2
JONES        101         53        3.6          1

फिर आप उस जेनरेट किए गए rnk . पर पिवट कर सकते हैं नंबर:

with pivot_data as (
  select e.ename, r.room, p.scr,
    sum(d.workhrs) over (partition by e.ename) as wrkhrs,
    rank() over (partition by e.ename order by r.room, p.scr) as rnk
  from productivity p
  join productivityd d on d.productivityid = p.productivityid
  join emp e on e.empno=p.employeeid
  join rooms r on r.id = p.roomid
)
select *
from   pivot_data
pivot (
  min(room) as room, min(scr) as scr  --<-- pivot_clause
  for rnk                             --<-- pivot_for_clause        
  in  (1, 2, 3)                       --<-- pivot_in_clause         
);

ENAME     WRKHRS     1_ROOM      1_SCR     2_ROOM      2_SCR     3_ROOM      3_SCR
----- ---------- ---------- ---------- ---------- ---------- ---------- ----------
ALLEN       7.32        101         43        102         22                      
JONES        3.6        101         53                                            

आपको पता होना चाहिए कि किसी कर्मचारी के पास अधिकतम कितने कमरे हो सकते हैं - यानी उच्चतम rnk कभी भी हो सकता है - और उन सभी को in . में शामिल करें खंड। इसका मतलब है कि आपके पास खाली कॉलम होने की संभावना है, जैसा कि इस उदाहरण में जहां 3_room के लिए कोई डेटा नहीं है या 3_scr . हालांकि, आप इससे तब तक नहीं बच सकते, जब तक कि आपको XML परिणाम न मिल जाए या क्वेरी गतिशील रूप से उत्पन्न न हो जाए।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तालिका डेटाबेस से लगातार सामग्री प्राप्त करना

  2. UTL_FILE.WRITE_ERROR utl_file.put को लूप में कॉल करते समय

  3. SQL के एक टुकड़े को Oracle फ़ंक्शन में बदलें

  4. OPEN QUERY में WHERE क्लॉज

  5. VARCHAR2 को संख्या में बदलें