मेरा सुझाव है कि पहले आपके एकाधिक कॉलम में 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