In a previous posting I described a simple example of Pivot – a much used feature which I personally have problems recalling the syntax of (hence the article in the first place). It’s lesser known relative in UnPivot, which is designed to do the opposite – it transforms columns of data into rows.
In the following example I have a few details about properties – the number of Bedrooms, Garages, Gardens and Attic Spaces. I’ve used this as an example because the column names will make it more apparent how the query and the results are connected.
I want to transform the data from showing the property features as column names to actually have those column names listed as data, along with the values that these columns contain:
First of all – the test data:
CREATE TABLE #Properties ( PropertyID INT , Attic_Spaces INT , Bedrooms INT , Garages INT , Gardens INT ) ; GO INSERT INTO #Properties ( PropertyID, Attic_Spaces, Bedrooms, Garages, Gardens ) VALUES ( 101, 1, 2, 0, 1 ), ( 102, 2, 1, 1, 2 ), ( 103, 1, 2, 1, 2 ), ( 104, 1, 3, 2, 2 ) ; GO SELECT * FROM #Properties ;
The basic construct of an UnPivot is quite simple:
SELECT PropertyID, PropertyFeature, NumberOf FROM #Properties p UNPIVOT ( NumberOf FOR PropertyFeature IN ( Attic_Spaces, Bedrooms, Garages, Gardens ) ) AS unpvt ;
This will select PropertyID from the #Properties table. Then it will select the columns ‘PropertyFeature’ and ‘NumberOf’ from the UNPIVOT part of the query. In this section I have asked it to create a column called ‘PropertyFeature’, which is taken from the columns called ‘Attic_Spaces’, ‘Bedrooms’, ‘Garages’ and ‘Gardens’. The value that is held within those ‘original’ columns (within the #Properties table) will be stored in the column called ‘NumberOf’ within the UNPIVOT section.
The alias for the #Properties table isn’t required, it’s just a habit of mine. However, the alias for the UNPIVOT (the ‘AS unpvt’) is mandatory even though you see no reference to it.
This may not be the most accurate description of what it is really doing, but it is how my brain gets around the syntax and that’s good enough for me, for now.