- HubPages»
- Technology»
- Computers & Software»
- Computer Software
How to concatenate rows in SQL server? – Concatenate Rows using FOR XML PATH()
Concatenation of several columns is easy and every can do. We have to use '+' and the column names to Concatenate. But how to do Concatenation among rows? Have you any idea? Yes, I am talking how to concatenating rows. I need couple of hours to figure out. I am not a SQL boss :) so, I need some time. Anyway, I solved this and feel to share all. Because I like to share my knowledge. :)
For this tutorial, we will use the AdventureWork2008R2 database. And I wan to use the tables [Production].[ProductCategory] and [Production].[ProductSubcategory] to display all the sub-category items under one category item. So, we need rows Concatenation. So, lets try.
I will break-down the whole problem into 3 steps:
- First, I want to show what are the outlook of those tables
- Now create a table which has category and subcategory using inner join
- Concatenation of rows to display the lists of subcategory under one category
Step 1: First, I want to show what are the outlook of those tables
We simply write the select query to display all the rows of [Production].[ProductCategory] and [Production].[ProductSubcategory] table
Query for ProductCategory table
select * from [Production].[ProductCategory]
Output of ProductCategory table
Query of ProductSubcategory table
select * from [Production].[ProductSubcategory]
Output of ProductSubcategory table
Step 2: Now create a table which has category and subcategory using inner join
Our required colums are category name and sub-category name column. So, if we create a natural join based on the ProductID then we can easily get the list of products-category and products-sub-category like column. So, lets do this
select cat.Name [Category Name] ,sub.Name [Sub-category Name] from [Production].[ProductCategory] cat inner join [Production].[ProductSubcategory] sub on cat.ProductCategoryID = sub.ProductCategoryID
Output of inner join
Step 3: Concatenation of rows to display the lists of subcategory under one category
From the above pictures, we are seeing the lists of category name and subcategory name. But the category name is repeated and we don't want the repetition. Our goal is to display all the sub-category items under each category. So, we need to use FOR XMP PATH() to do this.
The sub-category items should be listed under the category item. So, the main table will be the [Production].[ProductCategory] table. Our final output should be 2 columns: category name and subcategory name. Form the table [Production].[ProductCategory] we can easily filter the category name and named it as Product Category. So, try to write the following query to display only the category name.
select cat.Name from [Production].[ProductCategory] cat
Now, we will use for xml clause to retrieve select query result as XML format. So, the code should looks like the following:
select cat.Name [Category Name] ,(select sub.Name from [Production].[ProductSubcategory] sub where sub.ProductCategoryID = cat.ProductCategoryID for xml path('') ) from [Production].[ProductCategory] cat
Our goal is to lists the output like a,b,c. So, we will use a trick. We will concatenate the subcategory with ,. So, the query looks like the following:
select cat.Name [Category Name] ,(select ',' + sub.Name from [Production].[ProductSubcategory] sub where sub.ProductCategoryID = cat.ProductCategoryID for xml path('') ) from [Production].[ProductCategory] cat
Now, delete the first , using the stuff function and name that column as Sub category. The final query should looks like the following:
select cat.Name [Category Name] ,stuff ( ( select ',' + sub.Name from [Production].[ProductSubcategory] sub where sub.ProductCategoryID = cat.ProductCategoryID for xml path('') ), 1, 1,'' ) [Sub category] from [Production].[ProductCategory] cat
And that's all following the above steps, we can easily concatenate rows. Hope, this is useful for new SQL developer. :)