All Forums Database
Koushik Chandra 10 posts Joined 08/12
10 Dec 2013
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

Koushik Chandra 10 posts Joined 08/12
10 Dec 2013

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

 

M.Saeed Khurram 544 posts Joined 09/12
10 Dec 2013

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

Koushik Chandra 10 posts Joined 08/12
11 Dec 2013

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

Kawish_Siddiqui 37 posts Joined 03/07
11 Dec 2013

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

 

 

Kawish Siddiqui -

Koushik Chandra 10 posts Joined 08/12
11 Dec 2013

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

You must sign in to leave a comment.