| Author |
Topic |
|
amolfarkade
Starting Member
6 Posts |
Posted - 2008-02-06 : 18:12:27
|
| How to get the crosstab out put for below tablesTable1Column_ID Column_name1 Column12 Column23 Column34 Column45 Column5Table 2Column_ID Row_ID Column_Containts1 1 A12 1 A23 1 A34 1 A45 1 A51 2 B12 2 B23 2 B34 2 B45 2 B51 3 C12 3 C23 3 C34 3 C45 3 C5I want the out put like belowColumn1 Column2 Column3 Column4 Column5A1 A2 A3 A4 A5B1 B2 B3 B4 B5C1 C2 C3 C4 C5 |
|
|
jdaman
Constraint Violating Yak Guru
354 Posts |
Posted - 2008-02-06 : 18:25:49
|
Using PIVOT like so:SELECT *FROM ( SELECT t1.Column_name, t2.Row_ID, t2.Column_Containts FROM Table_2 t2 JOIN Table_1 t1 ON t2.Column_ID = t1.Column_ID ) AS a PIVOT ( MAX(Column_Containts) FOR Column_name IN ( Column1, Column2, Column3, Column4, Column5 ) ) AS p |
 |
|
|
amolfarkade
Starting Member
6 Posts |
Posted - 2008-02-06 : 18:28:39
|
| Thanks for reply but the Column_names are not fixed every time.Its dynamic grid, so always number of columns and rows changes. |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2008-02-06 : 18:30:34
|
Without using aggregate function?I don't think that is possible.DECLARE @Sample TABLE (ColumnID TINYINT, RowID TINYINT, CellValue CHAR(2))INSERT @SampleSELECT 1, 1, 'A1' UNION ALLSELECT 2, 1, 'A2' UNION ALLSELECT 3, 1, 'A3' UNION ALLSELECT 4, 1, 'A4' UNION ALLSELECT 5, 1, 'A5' UNION ALLSELECT 1, 2, 'B1' UNION ALLSELECT 2, 2, 'B2' UNION ALLSELECT 3, 2, 'B3' UNION ALLSELECT 4, 2, 'B4' UNION ALLSELECT 5, 2, 'B5' UNION ALLSELECT 1, 3, 'C1' UNION ALLSELECT 2, 3, 'C2' UNION ALLSELECT 3, 3, 'C3' UNION ALLSELECT 4, 3, 'C4' UNION ALLSELECT 5, 3, 'C5'SELECT p.RowID, p.[1], p.[2], p.[3], p.[4], p.[5]FROM @Sample AS sPIVOT ( MAX(s.CellValue) FOR s.ColumnID IN ([1], [2], [3], [4], [5]) ) AS pORDER BY p.RowID E 12°55'05.25"N 56°04'39.16" |
 |
|
|
jdaman
Constraint Violating Yak Guru
354 Posts |
Posted - 2008-02-06 : 18:34:28
|
So youre after a dynamic script then:DECLARE @Sql VARCHAR(MAX), @ColumnList VARCHAR(1000)SELECT @ColumnList = COALESCE( @ColumnList + ', ' + Column_name, Column_name, @ColumnList )FROM Table_1SET @Sql = 'SELECT *FROM ( SELECT t1.Column_name, t2.Row_ID, t2.Column_Containts FROM Table_2 t2 JOIN Table_1 t1 ON t2.Column_ID = t1.Column_ID ) AS a PIVOT ( MAX(Column_Containts) FOR Column_name IN ( '+ @ColumnList + ' ) ) AS p'EXEC (@Sql) |
 |
|
|
amolfarkade
Starting Member
6 Posts |
Posted - 2008-02-06 : 18:50:15
|
| jdaman,its giving me below errorIncorrect syntax near the keyword 'Column1'. |
 |
|
|
jdaman
Constraint Violating Yak Guru
354 Posts |
Posted - 2008-02-06 : 18:52:29
|
Try running this and let me know the output.DECLARE @ColumnList VARCHAR(1000)SELECT @ColumnList = COALESCE( @ColumnList + ', ' + Column_name, Column_name, @ColumnList )FROM Table_1PRINT @ColumnList You should receive a result similar to: "Column1, Column2, Column3" |
 |
|
|
amolfarkade
Starting Member
6 Posts |
Posted - 2008-02-06 : 20:03:13
|
| John Daman,Thanks a lot now it’s working very fine.But now I want to reverse action from the PIVOT table data into two different tables.Please help me |
 |
|
|
jdaman
Constraint Violating Yak Guru
354 Posts |
Posted - 2008-02-07 : 09:48:56
|
| Lets start with the lay out for the two new tables using the sample data from your first post. |
 |
|
|
amolfarkade
Starting Member
6 Posts |
Posted - 2008-02-07 : 13:09:21
|
| John,I need the data back from PIVOT table into below table as belowColumn_ID Column_name1 Column12 Column23 Column34 Column45 Column5Table 2Column_ID Row_ID Column_Containts1 1 A12 1 A23 1 A34 1 A45 1 A51 2 B12 2 B23 2 B34 2 B45 2 B51 3 C12 3 C23 3 C34 3 C45 3 C5 |
 |
|
|
amolfarkade
Starting Member
6 Posts |
Posted - 2008-02-07 : 15:32:57
|
| Any Update |
 |
|
|
jdaman
Constraint Violating Yak Guru
354 Posts |
Posted - 2008-02-07 : 16:45:46
|
Here is the complete code to pivot your tables and then unpivot the result back:IF OBJECT_ID('tempdb..#Table_1') IS NOT NULL DROP TABLE #Table_1CREATE TABLE #Table_1 ( Column_ID INT, Column_name VARCHAR(7) )INSERT #Table_1 ( Column_ID, Column_name )SELECT 1, 'Column1' UNIONSELECT 2, 'Column2' UNIONSELECT 3, 'Column3' UNIONSELECT 4, 'Column4' UNIONSELECT 5, 'Column5'IF OBJECT_ID('tempdb..#Table_2') IS NOT NULL DROP TABLE #Table_2CREATE TABLE #Table_2 ( Column_ID INT, Row_ID INT, Column_Containts VARCHAR(2) )INSERT #Table_2 ( Column_ID, Row_ID, Column_Containts )SELECT 1, 1, 'A1' UNIONSELECT 2, 1, 'A2' UNIONSELECT 3, 1, 'A3' UNIONSELECT 4, 1, 'A4' UNIONSELECT 5, 1, 'A5' UNIONSELECT 1, 2, 'B1' UNIONSELECT 2, 2, 'B2' UNIONSELECT 3, 2, 'B3' UNIONSELECT 4, 2, 'B4' UNIONSELECT 5, 2, 'B5' UNIONSELECT 1, 3, 'C1' UNIONSELECT 2, 3, 'C2' UNIONSELECT 3, 3, 'C3' UNIONSELECT 4, 3, 'C4' UNIONSELECT 5, 3, 'C5'DECLARE @Sql VARCHAR(MAX), @ColumnList VARCHAR(1000)SELECT @ColumnList = COALESCE( @ColumnList + ', ' + Column_name, Column_name, @ColumnList )FROM #Table_1/* PIVOT #Table_2 INTO ##pvt*/SET @Sql = 'SELECT * INTO ##pvtFROM ( SELECT t1.Column_name, t2.Row_ID, t2.Column_Containts FROM #Table_2 t2 JOIN #Table_1 t1 ON t2.Column_ID = t1.Column_ID ) AS a PIVOT ( MAX(Column_Containts) FOR Column_name IN ( '+ @ColumnList + ' ) ) AS p'IF OBJECT_ID('tempdb..##pvt') IS NOT NULL DROP TABLE ##pvtEXEC (@Sql)SELECT *FROM ##pvt/* UNPIVOT ##pvt */SET @Sql = 'SELECT t1.Column_ID, Row_ID, Column_ContaintsFROM ( SELECT Row_ID, Column1, Column2, Column3, Column4, Column5 FROM ##pvt ) a UNPIVOT ( Column_Containts FOR Column_name IN ( ' + @ColumnList + ' ) ) unpvt JOIN #Table_1 t1 ON unpvt.Column_name = t1.Column_name'EXEC (@Sql)Edit: I didnt recreate #Table_1 since it is only a lookup table and should still be available. |
 |
|
|
|
|
|