Click here to Skip to main content
15,887,875 members
Please Sign up or sign in to vote.
2.50/5 (2 votes)
SQL
select Floorno,RoomNo from floor


First_Floor	101
First_Floor	102
Second_Floor	201
Second_Floor	202
Third_Floor	301
Third_Floor	302

**************************************

I want to show this table as
First_Floor   101   102
Second_Floor  201   202
Third_Floor   301   302


Please Write the Full Query.
Posted
Updated 8-Aug-13 1:57am
v2
Comments
rranjansir 8-Aug-13 7:54am    
Then how to solve it..
Joezer BH 8-Aug-13 8:05am    
Provide some more details, what the output should be, what coloumns are you expecting on the "pivoted" table?

What if there are 4 rooms on Second_Floor, then you have a conflict in the coloumns...
Maciej Los 8-Aug-13 8:10am    
See my answer ;)
Maciej Los 8-Aug-13 8:01am    
It's pivot!
Joezer BH 8-Aug-13 8:03am    
Care to explain how it is pivot?

1 solution

Try it:
1) Static version:
SQL
DECLARE @rooms TABLE (Floorno VARCHAR(30),RoomNo INT)

INSERT INTO @rooms (Floorno ,RoomNo)
SELECT 'First_Floor', 101
UNION ALL SELECT 'First_Floor', 102
UNION ALL SELECT 'Second_Floor', 201
UNION ALL SELECT 'Second_Floor', 202
UNION ALL SELECT 'Third_Floor', 301
UNION ALL SELECT 'Third_Floor', 302

SELECT Floorno, [1], [2]
FROM (
	SELECT Floorno ,RoomNo, ROW_NUMBER() OVER (PARTITION BY Floorno ORDER BY Floorno, RoomNo) AS RoomID
	FROM @rooms
	) AS DT
PIVOT(MAX(RoomNo) FOR RoomID IN([1],[2])) AS PT


Result:
Floorno          1       2
----------------------------
First_Floor	101	102
Second_Floor	201	202
Third_Floor	301	302


2) Dynamic version
SQL
CREATE TABLE #rooms (Floorno VARCHAR(30),RoomNo INT)

INSERT INTO #rooms (Floorno ,RoomNo)
SELECT 'First_Floor', 101
UNION ALL SELECT 'First_Floor', 102
UNION ALL SELECT 'Second_Floor', 201
UNION ALL SELECT 'Second_Floor', 202
UNION ALL SELECT 'Third_Floor', 301
UNION ALL SELECT 'Third_Floor', 302
UNION ALL SELECT 'Third_Floor', 303

DECLARE @cols VARCHAR(300)
DECLARE @dt VARCHAR(2000)
DECLARE @pt VARCHAR(MAX)

SET @cols = STUFF((SELECT DISTINCT '],[' + CONVERT(NVARCHAR(10),O.[RoomID])
					FROM (
						SELECT ROW_NUMBER() OVER (PARTITION BY Floorno ORDER BY Floorno, RoomNo) AS RoomID
						FROM #rooms
					) AS O
					ORDER BY '],[' + CONVERT(NVARCHAR(10),O.[RoomID])
			FOR XML PATH('')),1,2,'') + ']'


SET @dt = N'SELECT Floorno ,RoomNo, ROW_NUMBER() OVER (PARTITION BY Floorno ORDER BY Floorno, RoomNo) AS RoomID
		FROM #rooms'
SET @pt = N'SELECT Floorno, ' + @cols + ' ' +
	'FROM (' + @dt +  ') AS DT ' +
	'PIVOT(MAX(RoomNo) FOR RoomID IN(' + @cols + ')) AS PT'

EXEC(@pt)

DROP TABLE #rooms


Result:
Floorno          1       2       3
------------------------------------
First_Floor	101	102	NULL
Second_Floor	201	202	NULL
Third_Floor	301	302	303
 
Share this answer
 
v2
Comments
Joezer BH 8-Aug-13 8:18am    
What will happen if second floor has 3 rooms?
Maciej Los 8-Aug-13 8:21am    
Nothing.
This is static example, it's possible to write dynamic. Please, be patient, i'll show you ;)
Joezer BH 8-Aug-13 8:28am    
Ah patience ... that's a tough nut to crack ;)
Maciej Los 8-Aug-13 8:30am    
See it now ;)
Joezer BH 8-Aug-13 8:32am    
And the wait was worth it!

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900