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

Oracle SQL ट्रांसपोज़

मेरा सुझाव है कि पहले आपके एकाधिक कॉलम में UNPIVOT फ़ंक्शन लागू करें, फिर row_number() का उपयोग करें अपने नए कॉलम नाम बनाने के लिए जिनका उपयोग PIVOT में किया जाएगा।

अनपिवट के लिए मूल सिंटैक्स होगा

select field, 
  value,
  'value'||
   to_char(row_number() over(partition by field
                              order by value)) seq
from yourtable
unpivot
(
  value
  for field in (Name, Age, Sex, DOB, col1, col2, col3)
) u;

देखें SQL Fiddle with Demo . यह आपके डेटा के कई कॉलम को कई पंक्तियों में बदलने वाला है। मैंने row_number() . का इस्तेमाल किया अपने नए कॉलम नामों के लिए एक अद्वितीय मान बनाने के लिए, इस क्वेरी का डेटा इस तरह दिखता है:

| FIELD |                   VALUE |    SEQ |
|-------|-------------------------|--------|
|   AGE |                      12 | value1 |
|   AGE |                      15 | value2 |
|  COL1 |                      aa | value1 |
|  COL1 |                      xx | value2 |

तब आप इस परिणाम पर PIVOT फ़ंक्शन लागू कर सकते हैं:

select field, value1, value2
from
(
  select field, 
    value,
    'value'||
      to_char(row_number() over(partition by field
                                order by value)) seq
  from yourtable
  unpivot
  (
    value
    for field in (Name, Age, Sex, DOB, col1, col2, col3)
  ) u
) d
pivot
(
  max(value)
  for seq in ('value1' as value1, 'value2' as value2)
) piv

देखें SQL Fiddle with Demo . यह एक अंतिम परिणाम देता है:

| FIELD |                  VALUE1 |                  VALUE2 |
|-------|-------------------------|-------------------------|
|   AGE |                      12 |                      15 |
|  COL1 |                      aa |                      xx |
|  COL2 |                      bb |                      yy |
|  COL3 |                      cc |                      zz |
|   DOB | 07-Aug-2001 12:00:00 AM | 26-Aug-2001 12:00:00 AM |
|  NAME |                       A |                       B |
|   SEX |                       F |                       M |

ध्यान दें, जब आप अनपिवट फ़ंक्शन को लागू कर रहे हों तो सभी स्तंभों का डेटाटाइप समान होना चाहिए ताकि आपको अपने डेटा को अनपिवट करने से पहले एक सबक्वेरी में परिवर्तित करना पड़े।

UNPIVOT/PIVOT फ़ंक्शन Oracle 11g में पेश किया गया था, यदि आप Oracle 10g का उपयोग कर रहे हैं, तो आप उपयोग करने के लिए क्वेरी को संपादित कर सकते हैं:

with cte as
(
  select 'name' field, name value
  from yourtable
  union all
  select 'Age' field, Age value
  from yourtable
  union all
  select 'Sex' field, Sex value
  from yourtable
  union all
  select 'DOB' field, DOB value
  from yourtable
  union all
  select 'col1' field, col1 value
  from yourtable
  union all
  select 'col2' field, col2 value
  from yourtable
  union all
  select 'col3' field, col3 value
  from yourtable
)
select
  field,
  max(case when seq = 'value1' then value end) value1,
  max(case when seq = 'value2' then value end) value2
from
(
  select field, value,
  'value'||
      to_char(row_number() over(partition by field
                                order by value)) seq
  from cte
) d
group by field;

देखें SQL Fiddle with Demo




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC पर इस Oracle स्टेटमेंट को कैसे निष्पादित करें

  2. Oracle वॉलेट प्रमाणीकरण के साथ स्प्रिंग-jdbc से Oracle DB से कनेक्ट करें

  3. क्या स्पष्ट एएनएसआई जॉइन बनाम निहित जॉइन के उपयोग पर ओरेकल की आधिकारिक सिफारिश है?

  4. पैसे डालते समय उपयोग करने के लिए SQL डेटाटाइप

  5. ओरेकल एसक्यूएल में एक परिणाम के रूप में दो अलग-अलग प्रश्नों का आउटपुट