*Originally published in our old blog on August 12, 2011
Let's say you have a table that looks something like this:
You don't know how many rows there are for each GroupID and your job is to generate a list that contains all values associated with a given GroupID in a single row. Here is a simple way to do it:
First: create a target table that looks something like this:
Second: copy, adjust based on your needs, and execute the following simple script (note I used a vertical line as a value separator - you can use whatever you need, just make sure the character you choose as a separator does not exist inside the actual values of the columns):
Finally, you can take the results from the target table and dump them onto Excel or wherever you need to.
Let's say you have a table that looks something like this:
CREATE TABLE [Source_Vertical]( [ID] [int] IDENTITY(1,1) NOT NULL, [GroupID] [int] NOT NULL, [Col1_Group] [varchar](50) NULL, [Col2_Group] [varchar](50) NULL, [Col1_Individual] [varchar](50) NULL, [Col2_Individual] [varchar](50) NULL)
You don't know how many rows there are for each GroupID and your job is to generate a list that contains all values associated with a given GroupID in a single row. Here is a simple way to do it:
First: create a target table that looks something like this:
CREATE TABLE [Target_Horizontal]( [GroupID] [int] NOT NULL, [GroupValues] [varchar](max) NULL)
Second: copy, adjust based on your needs, and execute the following simple script (note I used a vertical line as a value separator - you can use whatever you need, just make sure the character you choose as a separator does not exist inside the actual values of the columns):
DECLARE @GroupID int
DECLARE @GroupID_Current int
DECLARE @Col1_Group varchar(50)
DECLARE @Col2_Group varchar(50)
DECLARE @Col1_Individual varchar(50)
DECLARE @Col2_Individual varchar(50)
DECLARE list_cursor CURSOR
FOR SELECT * FROM dbo.Source_Vertical ORDER BY GroupID
OPEN list_cursor
FETCH NEXT FROM list_cursor INTO
@GroupID,
@Col1_Group,
@Col2_Group,
@Col1_Individual,
@Col2_Individual
SET @GroupID_Current = ''
WHILE @@FETCH_STATUS = 0
BEGIN
IF @GroupID_Current <> @GroupID
BEGIN
INSERT INTO Target_Horizontal (Id, GroupValues) VALUES(@GroupID, @Col1_Group + '|' + @Col2_Group + '|' + @Col1_Individual + '|' + @Col2_Individual)
SET @GroupID_Current = @GroupID
END
ELSE
BEGIN
UPDATE Target_Horizontal SET GroupValues = GroupValues + '|' + @Col1_Individual + '|' + @Col2_Individual WHERE GroupID = @GroupID
END
FETCH NEXT FROM list_cursor INTO
@GroupID,
@Col1_Group,
@Col2_Group,
@Col1_Individual,
@Col2_Individual
END
CLOSE list_cursor;
DEALLOCATE list_cursor;
Finally, you can take the results from the target table and dump them onto Excel or wherever you need to.
0 comments:
Post a Comment