Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
cgkitab
Starting Member
6 Posts |
Posted - 2008-06-05 : 12:15:04
|
I have data sent given in a table but in a crosstab form:Acct# Desc Jan Feb Mar Apr etc...-------- -------- ----- ----- ----- -----52100 Cash 0 40 50 90What I want to do is get some code that will convert this to records - ie.Account# Desc Month Amount------------- -------- --------- ----------52100 Cash Jan 052100 Cash Feb 40Any ideas on code to achieve this? |
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2008-06-05 : 12:39:57
|
[code]DECLARE @Sample TABLE ([Acct#] INT, [Desc] VARCHAR(5), Jan INT, Feb INT, Mar INT, Apr INT)INSERT @SampleSELECT 52100, 'Cash', 0, 40, 50, 90SELECT [Acct#], [Desc], 'Jan' AS Month, Jan AS AmountFROM @SampleUNION ALLSELECT [Acct#], [Desc], 'Feb' AS Month, Feb AS AmountFROM @SampleUNION ALLSELECT [Acct#], [Desc], 'Mar' AS Month, Mar AS AmountFROM @SampleUNION ALLSELECT [Acct#], [Desc], 'Apr' AS Month, Apr AS AmountFROM @Sample[/code] E 12°55'05.25"N 56°04'39.16" |
 |
|
blindman
Master Smack Fu Yak Hacker
2365 Posts |
Posted - 2008-06-05 : 12:43:44
|
Go buy a lottery ticket, because today is your lucky day.create function NormalizeXTabSQL(@TableName varchar(500), @ColumnIncrement int, @StartColumn int, @EndColumn int)returns varchar(4000)asbegin--NormalizeXTab--blindman, 2/4/2005--Returns a SQL UNION statement that converts repeating--column groups in a table into normalized individual records.--Test parameters-- declare @TableName varchar(500)-- declare @ColumnIncrement int-- declare @StartColumn int-- declare @EndColumn int-- set @TableName = 'LimsImportStaging' --Name of your target table-- set @ColumnIncrement = 3 --Number of columns to return for each statement-- set @StartColumn = 2-- set @EndColumn = 16declare @ColumnString varchar(500)declare @ColumnCounter intdeclare @SQLString varchar(4000)set @ColumnCounter = isnull(@StartColumn, 1) - 1set @EndColumn = isnull(@EndColumn, (select count(*) from sysobjects inner join syscolumns on sysobjects.id = syscolumns.id where sysobjects.name = @TableName))while @ColumnCounter < @EndColumnbegin set @ColumnString = null set @ColumnCounter = @ColumnCounter + @ColumnIncrement select @ColumnString = isnull(@ColumnString + ', ', '') + syscolumns.name from sysobjects inner join syscolumns on sysobjects.id = syscolumns.id where sysobjects.name = @TableName and colid > @ColumnCounter - @ColumnIncrement and colid <= @ColumnCounter and colid <= @EndColumn order by colid set @SQLString = isnull(@SQLString + char(13) + 'UNION' + char(13), '') + 'select ' + @ColumnString + ' from ' + @TableNameendreturn @SQLStringend I don't remember why I coded this as a UDF. You could easily run it as a script instead.e4 d5 xd5 Nf6 |
 |
|
cgkitab
Starting Member
6 Posts |
Posted - 2008-06-05 : 12:47:38
|
Thanks for the answers - I will try shortly!!CheersAllan |
 |
|
|
|
|
|
|