April 12, 2005 at 7:58 am
Hi there,
I have some data as shown below that I need to format in a particular way. I'd like to use TSQL if at all possible for speed and re-use. The test data looks as follows:
Row,Col,Value
0,1,Q1Answer|Q1
1,1,Test1
2,1,Test2
3,1,Test3
4,1,Test4
5,1,Test5
0,2,Q2Answer|Q2
1,2,Test1
2,2,Test2
3,2,Test3
4,2,Test4
5,2,Test5
0,3,Q3Answer|Q3
1,3,Test1
2,3,Test2
3,3,Test3
4,3,Test4
5,3,Test5
0,4,Q4Answer|Q4
1,4,30/03/2005
2,4,29/04/2005
3,4,30/03/2005
4,4,28/12/2004
5,4,30/12/2009
0,5,Q5Answer|Q5
1,5,Male
2,5,Male
3,5,Female
4,5,Female
5,5,Male
Row 0 contains the headers I would like to use for my columns. So, Row 0, Column 1 should be Q1Answer|Q1. Row 1- 5 in Col 1 will be the data in the columns and so on...
This is how I would like the data:
Q1Answer|Q1,Q2Answer|Q2,Q3Answer|Q3,Q4Answer|Q4,Q5Answer|Q5
Test1,Test1,Test1,30/03/2005,Male
Test2,Test2,Test2,29/04/2005,Male
etc....
Help would be appreciated. Thanks.
April 12, 2005 at 10:56 am
I assume you are getting this data as a file...if so I would do it in a few steps
1) Stuff the data into a table(temp) so it looks like your original data file (Use DTS ).
2) Use a nested CURSOR to run through the data and create and execute dynamic INSERT statements ( 1st cursor to select current row and 2nd to select all the columns of current row )
April 12, 2005 at 7:22 pm
I agree with Craig for step 1 -- make sure the data is entered into a 3-column table.
Then run something like
SELECT
(select value from DataTable dt1 where dt1.row = dt.row and dt1.col = 1)
, (select value from DataTable dt2 where dt1.row = dt.row and dt1.col = 2)
, (select value from DataTable dt3 where dt1.row = dt.row and dt1.col = 3)
, (select value from DataTable dt4 where dt1.row = dt.row and dt1.col = 4)
, (select value from DataTable dt5 where dt1.row = dt.row and dt1.col = 5)
FROM DataTable dt
ORDER BY dt.Row
This produces a five-column result set as you desire. If you really want the comma-delimited version, you could concatenate the select subqueries with commas (...+ ',' + ...) or you could run the whole thing in query analyzer and save it to a csv file. The query should run faster than a cursor method.
Hope this helps,
Scott Thornburg
April 13, 2005 at 6:03 am
Thanks guys. I was using VB to build the nested select dynamically but was hoping there was another way to do it. The data is in a table already which makes life easier. The table is being used for reporting so the number of rows and columns will vary for each report. I guess there is no way to do the query dynamically with SQl then...
April 15, 2005 at 5:40 pm
How about using Dynamic SQL - not the greatest for security, but it does work! I would wrap it up in a proc.
DECLARE @sql varchar(8000)
SET @sql = ''
WHEN '' THEN ISNULL(' Max(CASE [Col] WHEN ' + CAST([Col] as varchar(5)) + ' THEN [Value] ELSE Null END) as ' + QUOTENAME([Value]), '')
ELSE @sql + ',' + CHAR(13) + CHAR(10) + ISNULL(' Max(CASE [Col] WHEN ' + CAST([Col] as varchar(5)) + ' THEN [Value] ELSE Null END) as ' + QUOTENAME([Value]), '')
END
FROM dbo.Test
WHERE Row = 0
ORDER BY Col
SELECT @sql = 'SELECT [Row],' + CHAR(13) + CHAR(10) + @sql + CHAR(13) + CHAR(10) +
' FROM [Test]' + CHAR(13) + CHAR(10) +
' WHERE [Row] > 0' + CHAR(13) + CHAR(10) +
' GROUP BY [Row]' + CHAR(13) + CHAR(10) +
' ORDER BY [Row]'
EXEC(@sql)
April 19, 2005 at 6:05 am
Thanks, I'll give it a whirl.
Viewing 6 posts - 1 through 5 (of 5 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy