Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
ganeshkumar08
Posting Yak Master
187 Posts |
Posted - 2011-05-18 : 04:47:22
|
Hello all,This is my sample dataDECLARE @FEEDBACK TABLE(SECTION VARCHAR(25),SUBSECTION VARCHAR(5))INSERT INTO @FEEDBACKSELECT 'PUNCHUALITY','A1' UNION ALLSELECT 'CONCEPTUAL','A1' UNION ALLSELECT 'PUNCHUALITY','A2' UNION ALLSELECT 'CONCEPTUAL','A2' UNION ALLSELECT 'PUNCHUALITY','A3' UNION ALLSELECT 'CONCEPTUAL','A3' UNION ALLSELECT 'PUNCHUALITY','A4' UNION ALLSELECT 'CONCEPTUAL','A4'SELECT * FROM @FEEDBACKMy output should be like belowPUNCHUALITY CONCEPTUALA1 A1A2 A2A3 A3A4 A4A5HOW TO GET LIKE ABOVE, CAN ANY ONE GIVE ME IDEA.THANKSGANESH KUMAR VSolutions are easy. Understanding the problem, now, that's the hard part |
|
ganeshkumar08
Posting Yak Master
187 Posts |
Posted - 2011-05-18 : 05:51:57
|
hi all i got an idea and applied and wrote a logic as belowIF OBJECT_ID('tempdb..#FEEDBACK', 'U') IS NOT NULL DROP TABLE #FEEDBACK IF OBJECT_ID('tempdb..##FINALRES', 'U') IS NOT NULL DROP TABLE ##FINALRESCREATE TABLE #FEEDBACK(SECTION VARCHAR(25),SUBSECTION VARCHAR(5))INSERT INTO #FEEDBACKSELECT 'PUNCHUALITY','A1' UNION ALLSELECT 'CONCEPTUAL','A1' UNION ALLSELECT 'PUNCHUALITY','A2' UNION ALLSELECT 'CONCEPTUAL','A2' UNION ALLSELECT 'PUNCHUALITY','A3' UNION ALLSELECT 'CONCEPTUAL','A3' UNION ALLSELECT 'PUNCHUALITY','A4' UNION ALLSELECT 'CONCEPTUAL','A4' UNION ALLSELECT 'CONCEPTUAL','A5' UNION ALLSELECT 'PUN1','A1' UNION ALLSELECT 'PUN1','A2' UNION ALLSELECT 'PUN1','A3' UNION ALLSELECT 'CON1','A1'--SELECT ROW_NUMBER() OVER(PARTITION BY SECTION ORDER BY SECTION,SUBSECTION)RNO,SECTION,SUBSECTION FROM #FEEDBACKDECLARE @TEMP INT,@CNT INT,@SECTIONNAME VARCHAR(25)SET @CNT = 0SELECT @CNT = MAX(A.RNO) FROM (SELECT ROW_NUMBER() OVER(PARTITION BY SECTION ORDER BY SECTION,SUBSECTION)RNO,SECTION,SUBSECTION FROM #FEEDBACK)ASELECT @SECTIONNAME = SECTION FROM (SELECT ROW_NUMBER() OVER(PARTITION BY SECTION ORDER BY SECTION,SUBSECTION)RNO,SECTION,SUBSECTION FROM #FEEDBACK)AWHERE A.RNO = @CNTDECLARE @COLLIST VARCHAR(1000)SET @COLLIST = ''SELECT @COLLIST = @COLLIST + A.SECTION + ' VARCHAR(25),' FROM (SELECT DISTINCT SECTION FROM #FEEDBACK) ASET @COLLIST=SUBSTRING(@COLLIST,1,LEN(@COLLIST)-1)EXEC('CREATE TABLE ##FINALRES(ID INT IDENTITY(1,1),'+ @COLLIST+')'+' INSERT INTO ##FINALRES('+@SECTIONNAME+')'+' SELECT SUBSECTION FROM #FEEDBACK WHERE SECTION = '''+ @SECTIONNAME +'''')DECLARE @SECTIONLIST TABLE(ID INT IDENTITY (1,1),SECTION VARCHAR(25))INSERT INTO @SECTIONLIST(SECTION)SELECT DISTINCT SECTION FROM #FEEDBACK WHERE SECTION <> @SECTIONNAMESET @TEMP = 1WHILE @TEMP <= (SELECT MAX(ID) FROM @SECTIONLIST)BEGIN SELECT @SECTIONNAME = SECTION FROM @SECTIONLIST WHERE ID = @TEMP EXEC('UPDATE ##FINALRES SET ' +@SECTIONNAME+ '=V.SUBSEC FROM' + '( SELECT ROW_NUMBER() OVER(PARTITION BY SECTION ORDER BY SECTION,SUBSECTION)RNO,SECTION SEC,SUBSECTION SUBSEC FROM #FEEDBACK WHERE SECTION ='''+@SECTIONNAME+''' )V WHERE ID = V.RNO' ) SET @TEMP = @TEMP + 1ENDDECLARE @DISPCOLS VARCHAR(1000)SET @DISPCOLS = ''SELECT @DISPCOLS = @DISPCOLS + A.SECTION + ',' FROM (SELECT DISTINCT SECTION FROM #FEEDBACK) ASET @DISPCOLS=SUBSTRING(@DISPCOLS,1,LEN(@DISPCOLS)-1)EXEC('SELECT '+@DISPCOLS+' FROM ##FINALRES')DROP TABLE ##FINALRESDROP TABLE #FEEDBACKSolutions are easy. Understanding the problem, now, that's the hard part |
 |
|
raghuveer125
Constraint Violating Yak Guru
285 Posts |
Posted - 2011-05-18 : 06:38:07
|
TRY THISDECLARE @FEEDBACK TABLE(SECTION VARCHAR(25),SUBSECTION VARCHAR(5))INSERT INTO @FEEDBACKSELECT 'PUNCHUALITY','A1' UNION ALLSELECT 'CONCEPTUAL','A1' UNION ALLSELECT 'PUNCHUALITY','A2' UNION ALLSELECT 'CONCEPTUAL','A2' UNION ALLSELECT 'PUNCHUALITY','A3' UNION ALLSELECT 'CONCEPTUAL','A3' UNION ALLSELECT 'PUNCHUALITY','A4' UNION ALLSELECT 'CONCEPTUAL','A4';WITH CTE AS(Select Case When Section='Punchuality' Then Subsection End As PUNCHUALITY, Case When Section ='Conceptual' Then Subsection End As CONCEPTUALfrom @FEEDBACK )sELECT C.CONCEPTUAL,F.PUNCHUALITY FROM CTE AS C JOIN CTE AS F ON C.CONCEPTUAL=F.PUNCHUALITYIn Love... With Me! |
 |
|
ganeshkumar08
Posting Yak Master
187 Posts |
Posted - 2011-05-18 : 06:56:45
|
Hi raghu,There will be any number of sections, in the above query you hard coded two section names, but it will not work if we have more than 2 section names.Solutions are easy. Understanding the problem, now, that's the hard part |
 |
|
sunitabeck
Master Smack Fu Yak Hacker
5155 Posts |
Posted - 2011-05-18 : 08:47:16
|
I like the way it rhymes! "Doubt in Pivot!!" Say it out loud 5 times Can you do it with a simple pivot like this?SELECT section,[a1],[a2]FROM @FEEDBACKPIVOT(MAX(subsection) FOR subsection IN ([a1],[a2])) P If you have an unknown number of subsections, you would need dynamic pivot as explained in Madhivanan's blog: http://beyondrelational.com/blogs/madhivanan/archive/2008/08/27/dynamic-pivot-in-sql-server-2005.aspx |
 |
|
|
|
|
|
|