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.

 All Forums
 SQL Server 2000 Forums
 Transact-SQL (2000)
 Convert a crosstab type table to records

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 90

What I want to do is get some code that will convert this to records - ie.

Account# Desc Month Amount
------------- -------- --------- ----------
52100 Cash Jan 0
52100 Cash Feb 40

Any 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 @Sample
SELECT 52100, 'Cash', 0, 40, 50, 90

SELECT [Acct#],
[Desc],
'Jan' AS Month,
Jan AS Amount
FROM @Sample

UNION ALL

SELECT [Acct#],
[Desc],
'Feb' AS Month,
Feb AS Amount
FROM @Sample

UNION ALL

SELECT [Acct#],
[Desc],
'Mar' AS Month,
Mar AS Amount
FROM @Sample

UNION ALL

SELECT [Acct#],
[Desc],
'Apr' AS Month,
Apr AS Amount
FROM @Sample[/code]


E 12°55'05.25"
N 56°04'39.16"
Go to Top of Page

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)
as
begin
--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 = 16

declare @ColumnString varchar(500)
declare @ColumnCounter int
declare @SQLString varchar(4000)

set @ColumnCounter = isnull(@StartColumn, 1) - 1

set @EndColumn = isnull(@EndColumn,
(select count(*)
from sysobjects
inner join syscolumns on sysobjects.id = syscolumns.id
where sysobjects.name = @TableName))

while @ColumnCounter < @EndColumn
begin
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 ' + @TableName
end

return @SQLString

end

I don't remember why I coded this as a UDF. You could easily run it as a script instead.

e4 d5 xd5 Nf6
Go to Top of Page

cgkitab
Starting Member

6 Posts

Posted - 2008-06-05 : 12:47:38
Thanks for the answers - I will try shortly!!

Cheers

Allan
Go to Top of Page
   

- Advertisement -