SQL to transpose (row to column) any level (nth level) of data

Database

SQL to transpose (row to column) any level (nth level) of data

Hi,

I have a data like below:

Tgt

Src

lvl

L3_Tab1.Col1

L2_Tab1.Col3

0

L3_Tab1.Col2

L2_Tab2.Col2

0

L3_Tab1.Col3

L2_Tab2.Col3

0

L3_Tab1.Col4

L2_Tab2.Col1

0

L2_Tab1.Col3

L1_Tab3.Col1

1

L2_Tab1.Col3

L1_Tab1.Col1

1

L2_Tab2.Col1

L1_Tab2.Col1

1

L2_Tab2.Col2

L1_Tab2.Col2

1

L2_Tab2.Col2

L1_Tab1.Col2

1

L2_Tab2.Col2

L1_Tab3.Col2

1

L2_Tab2.Col3

L1_Tab3.Col3

1

Which I want to transpose and see the result like below:

Tgt

Src

lvl_1

L3_Tab1.Col1

L2_Tab1.Col3

L1_Tab3.Col1

L3_Tab1.Col1

L2_Tab1.Col3

L1_Tab1.Col1

L3_Tab1.Col2

L2_Tab2.Col2

L1_Tab2.Col2

L3_Tab1.Col2

L2_Tab2.Col2

L1_Tab1.Col2

L3_Tab1.Col2

L2_Tab2.Col2

L1_Tab3.Col2

L3_Tab1.Col3

L2_Tab2.Col3

L1_Tab3.Col3

L3_Tab1.Col4

L2_Tab2.Col1

L1_Tab2.Col1

Now in this case there is only one level but in practical there can be multiple levels.

So the requirement is to transpose (row to column) any level (nth level) of data.

Please suggest

Regards,

Koushik

5 REPLIES

Re: SQL to transpose (row to column) any level (nth level) of data

Source Data





Tgt Src lvl
L3_Tab1.Col1 L2_Tab1.Col3 0
L3_Tab1.Col2 L2_Tab2.Col2 0
L3_Tab1.Col3 L2_Tab2.Col3 0
L3_Tab1.Col4 L2_Tab2.Col1 0
L2_Tab1.Col3 L1_Tab3.Col1 1
L2_Tab1.Col3 L1_Tab1.Col1 1
L2_Tab2.Col1 L1_Tab2.Col1 1
L2_Tab2.Col2 L1_Tab2.Col2 1
L2_Tab2.Col2 L1_Tab1.Col2 1
L2_Tab2.Col2 L1_Tab3.Col2 1
L2_Tab2.Col3 L1_Tab3.Col3 1

Output expected:




Tgt Src lvl_1
L3_Tab1.Col1 L2_Tab1.Col3 L1_Tab3.Col1
L3_Tab1.Col1 L2_Tab1.Col3 L1_Tab1.Col1
L3_Tab1.Col2 L2_Tab2.Col2 L1_Tab2.Col2
L3_Tab1.Col2 L2_Tab2.Col2 L1_Tab1.Col2
L3_Tab1.Col2 L2_Tab2.Col2 L1_Tab3.Col2
L3_Tab1.Col3 L2_Tab2.Col3 L1_Tab3.Col3
L3_Tab1.Col4 L2_Tab2.Col1 L1_Tab2.Col1

Re: SQL to transpose (row to column) any level (nth level) of data

Hi Koushik,

There is already a thread with this topic, you can consult that:

http://forums.teradata.com/forum/database/transpose-rows-to-columns-0

Khurram

Re: SQL to transpose (row to column) any level (nth level) of data

Hi Khurram,

My question is little different. In my example there is a linkage between Src column value of lvl=0 with Tgt column value of lvl=1

Source Data
Tgt Src lvl
L3_Tab1.Col1 L2_Tab1.Col3 0
L3_Tab1.Col2 L2_Tab2.Col2 0
L3_Tab1.Col3 L2_Tab2.Col3 0
L3_Tab1.Col4 L2_Tab2.Col1 0
L2_Tab1.Col3 L1_Tab3.Col1 1
L2_Tab1.Col3 L1_Tab1.Col1 1
L2_Tab2.Col1 L1_Tab2.Col1 1
L2_Tab2.Col2 L1_Tab2.Col2 1
L2_Tab2.Col2 L1_Tab1.Col2 1
L2_Tab2.Col2 L1_Tab3.Col2 1
L2_Tab2.Col3 L1_Tab3.Col3 1

Expected Target
Tgt Src lvl_1
L3_Tab1.Col1 L2_Tab1.Col3 L1_Tab3.Col1
L3_Tab1.Col1 L2_Tab1.Col3 L1_Tab1.Col1
L3_Tab1.Col2 L2_Tab2.Col2 L1_Tab2.Col2
L3_Tab1.Col2 L2_Tab2.Col2 L1_Tab1.Col2
L3_Tab1.Col2 L2_Tab2.Col2 L1_Tab3.Col2
L3_Tab1.Col3 L2_Tab2.Col3 L1_Tab3.Col3
L3_Tab1.Col4 L2_Tab2.Col1 L1_Tab2.Col1

Regards,

Kooushik

Re: SQL to transpose (row to column) any level (nth level) of data

Here is your solution.

I am placing full code so other gurus can correct it if one finds error or better solution.

CREATE TABLE myDB.SrcTgtMap
(
TgtCol VARCHAR(100),
SrcCol VARCHAR(100),
Lvl INTEGER
)
PRIMARY INDEX (lvl);

INSERT INTO myDB.SRCTGTMAP VALUES('L3_Tab1.Col1','L2_Tab1.Col3',0);
INSERT INTO myDB.SRCTGTMAP VALUES('L3_Tab1.Col2','L2_Tab2.Col2',0);
INSERT INTO myDB.SRCTGTMAP VALUES('L3_Tab1.Col3','L2_Tab2.Col3',0);
INSERT INTO myDB.SRCTGTMAP VALUES('L3_Tab1.Col4','L2_Tab2.Col1',0);
INSERT INTO myDB.SRCTGTMAP VALUES('L2_Tab1.Col3','L1_Tab3.Col1',1);
INSERT INTO myDB.SRCTGTMAP VALUES('L2_Tab1.Col3','L1_Tab1.Col1',1);
INSERT INTO myDB.SRCTGTMAP VALUES('L2_Tab2.Col1','L1_Tab2.Col1',1);
INSERT INTO myDB.SRCTGTMAP VALUES('L2_Tab2.Col2','L1_Tab2.Col2',1);
INSERT INTO myDB.SRCTGTMAP VALUES('L2_Tab2.Col2','L1_Tab1.Col2',1);
INSERT INTO myDB.SRCTGTMAP VALUES('L2_Tab2.Col2','L1_Tab3.Col2',1);
INSERT INTO myDB.SRCTGTMAP VALUES('L2_Tab2.Col3','L1_Tab3.Col3',1);

SELECT a.TgtCol, a.SrcCol, b.SrcCol As Lvl_1
FROM myDB.SRCTGTMAP a
INNER JOIN myDB.SRCTGTMAP b
ON a.SrcCol = b.TgtCol
AND a.lvl+1 = b.lvl
ORDER BY 1

Re: SQL to transpose (row to column) any level (nth level) of data

Thanks for your reply, but when I will have a dataset like below :

    Tgt      Src  lvl
============ ============ ====
L4_Tab1.Col1 L3_Tab2.Col3 0
L4_Tab1.Col4 L3_Tab2.Col1 0
L4_Tab1.Col2 L3_Tab1.Col2 0
L4_Tab1.Col3 L3_Tab1.Col3 0
L3_Tab2.Col1 L2_Tab2.Col3 1
L3_Tab1.Col2 L2_Tab2.Col2 1
L3_Tab2.Col3 L2_Tab1.Col3 1
L3_Tab1.Col3 L2_Tab2.Col3 1
L2_Tab2.Col3 L1_Tab3.Col3 2
L2_Tab1.Col3 L1_Tab3.Col1 2
L2_Tab2.Col2 L1_Tab2.Col2 2
L2_Tab1.Col3 L1_Tab1.Col1 2
L2_Tab2.Col2 L1_Tab1.Col2 2
L2_Tab2.Col2 L1_Tab3.Col2 2

I have to write a query like below :

SELECT a.Tgt, a.Src, b.Src AS Lvl_1, c.Src AS Lvl_2
FROM SRCTGTMAP a
INNER JOIN SRCTGTMAP b
ON a.src=b.Tgt
AND a.lvl+1 = b.lvl
INNER JOIN SRCTGTMAP C
ON b.src=c.Tgt
AND b.lvl+1 = c.lvl
ORDER BY 1

Means I have to use the same table again in inner join to get another level.

Can this be done with a query which can work in any (multiple) level?

Regards,

Koushik