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

Oracle SQL में दो कॉलम पिवोटिंग

कॉलम में मानों के जोड़े की परिभाषित संख्या के लिए tname, ttype आप नीचे दी गई क्वेरी का उपयोग कर सकते हैं (ध्यान दें कि मैंने उदाहरण से आपके कॉलम नाम बदल दिए हैं, क्योंकि आपने वहां Oracle कीवर्ड का उपयोग किया था, मैंने टेबल को tasks के रूप में भी नामित किया था। , इसलिए आपको इस डेटा को कोड में हर जगह अपने वास्तविक कॉलम नाम और तालिका नाम में बदलना होगा):

select * from tasks 
pivot (max(tdate) for (tname, ttype) in 
  (('DG1','CF') DG1_CF, ('M0','A')  M0_A,  ('M0','POR') M0_POR,
   ('M1','A'  ) M1_A,   ('M1','CF') M1_CF, ('M2','A')   M2_A)));

संभावनाओं की गतिशील संख्या के लिए आपको इस क्वेरी को "बनाने" की कुछ प्रक्रिया की आवश्यकता होगी। यहाँ मैंने view . का प्रयोग किया है इसके लिए। प्रक्रिया कोड की प्रतिलिपि बनाएँ और इसे संकलित करें। जब आपकी तालिका में डेटा बदलता है तो आपको पहले प्रक्रिया चलानी होती है, फिर बस प्रक्रिया द्वारा बनाए गए दृश्य से चयन करें। ठीक से चलाने के लिए आपके स्कीमा को दिए गए दृश्य बनाने के लिए विशेषाधिकार की आवश्यकता होती है।

execute create_tasks_view;
select * from v_tasks;

anonymous block completed
   ID DG1_CF     M0_A       M0_POR     M1_A       M1_CF      M2_A     
----- ---------- ---------- ---------- ---------- ---------- ----------
45000 2015-03-02 2015-02-01 2015-03-11 2015-02-03 2015-03-01 2015-02-04 
44400 2015-02-02 2015-01-01 2015-02-11 2015-01-03 2015-02-01 2015-01-04

बेशक आप order by . जोड़कर या संशोधित करके अपनी इच्छानुसार पंक्तियों और स्तंभों के क्रम को बदल सकते हैं प्रक्रिया कोड में भाग:

create or replace procedure create_tasks_view as 
  v_sql varchar2(32767) := '';
begin
  for v in (select distinct tname, ttype from tasks order by tname, ttype) 
  loop
    v_sql := v_sql || '(''' || v.tname || ''',''' || v.ttype || ''') '
      ||v.tname||'_'||v.ttype||',';
  end loop;
  v_sql := 'create or replace view v_tasks as '
    ||'select * from tasks pivot (max(tdate) for (tname, ttype) in ('
    ||rtrim(v_sql, ', ')||'))'; 
  execute immediate v_sql;
end create_tasks_view;

मेरा मानना ​​है कि लिंक में आपके प्रश्न के लिए और भी सार्वभौमिक समाधान है जो मैंने आपको टिप्पणियों में दिया है:डायनामिक एसक्यूएल पिवोटिंग... . यह बहुत आशाजनक लग रहा है, बस ध्यान से अनुभाग संसाधन पढ़ें नीचे, और निर्देश के चरणों का पालन करें। मैंने व्यक्तिगत रूप से इस पद्धति की जाँच नहीं की, लेकिन शायद यह मेरे "प्रक्रिया-दृश्य" समाधान से अधिक आपके लिए उपयुक्त होगा।




  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. OracleLob को किसी फ़ंक्शन के पैरामीटर के रूप में पास करना

  3. बी-ट्री बनाम बिटमैप डेटाबेस इंडेक्स

  4. Oracle में दिन के नाम पर राइट पैडिंग कैसे निकालें?

  5. ORA-12704:कैरेक्टर सेट मिसमैच