Solved

sql - oracle (row to column)

Posted on 2009-04-01
5
1,074 Views
Last Modified: 2013-12-19
I have the data something like this.

col_1     col_2  
x           abc
x           def

y           123
y           456




I need the o/p like this:

col_1    col_2    col_3

x          abc       def

y         123        456

0
Comment
Question by:vishali_vishu
  • 3
  • 2
5 Comments
 
LVL 1

Author Comment

by:vishali_vishu
Comment Utility

select x.col_1,x.col_2,y.col_2  from table x, table y
where x.col_1=y.col_1
and x.rowid <> y.rowid.

but i am getting o/p as:

col_1   col_2   col_3
x         abc      def
x         def      abc

y        123    456
y        456    123


0
 
LVL 73

Expert Comment

by:sdstuber
Comment Utility
try this...
ee.txt
0
 
LVL 73

Expert Comment

by:sdstuber
Comment Utility
sample script to test it...

 

CREATE TABLE your_table

AS

    SELECT 'x' col_1, 'abc' col_2 FROM DUAL

    UNION ALL

    SELECT 'x', 'def' FROM DUAL

    UNION ALL

    SELECT 'y', '123' FROM DUAL

    UNION ALL

    SELECT 'y', '456' FROM DUAL;
 

  SELECT col_1, MAX(DECODE(rn, 1, col_2)) col_2, MAX(DECODE(rn, 2, col_2)) col_3

    FROM (SELECT col_1, col_2, ROW_NUMBER() OVER (PARTITION BY col_1 ORDER BY col_2) rn

            FROM your_table)

GROUP BY col_1;
 
 

Table created.
 

C COL COL

- --- ---

x abc def

y 123 456
 

2 rows selected.

Open in new window

0
 
LVL 1

Author Comment

by:vishali_vishu
Comment Utility
sdstuber:

It is working good.

can you explain me bit further....


0
 
LVL 73

Accepted Solution

by:
sdstuber earned 500 total points
Comment Utility
anytime you have a query like this you don't understand, break it apart from the inside out...


SELECT col_1, col_2, ROW_NUMBER() OVER (PARTITION BY col_1 ORDER BY col_2) rn
            FROM your_table

this numbers each row by column 1,  so the first X is rn=1,  the second x is rn=2,  the first Y is rn=1, the second y is rn=2

then you select that data using decode to only keep the data for the "rn" you want for that column.


max and group by put it all together, remove that aggregation to see the raw results...

SELECT col_1, DECODE(rn, 1, col_2) col_2, DECODE(rn, 2, col_2) col_3
    FROM (SELECT col_1, col_2, ROW_NUMBER() OVER (PARTITION BY col_1 ORDER BY col_2) rn
            FROM your_table)

If you had more values for each x or y you could simply add more max and decodes...
 MAX(DECODE(rn, 3, col_2)) col_4, MAX(DECODE(rn, 4, col_2)) col_5, etc...
0

Featured Post

What Security Threats Are You Missing?

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Cursors in Oracle: A cursor is used to process individual rows returned by database system for a query. In oracle every SQL statement executed by the oracle server has a private area. This area contains information about the SQL statement and the…
In our personal lives, we have well-designed consumer apps to delight us and make even the most complex transactions simple. Many enterprise applications, however, are a bit behind the times. For an enterprise app to be successful in today's tech wo…
This video explains at a high level about the four available data types in Oracle and how dates can be manipulated by the user to get data into and out of the database.
Via a live example, show how to take different types of Oracle backups using RMAN.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now