Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

Get ExcelColumn-Char from Number

Posted on 2007-11-23
12
Medium Priority
?
262 Views
Last Modified: 2010-05-18
I'm pretty new with SQL-Server and never created a custom function.
I have a table column (int) which represents an Excel ColumnID. Now I need to display the column header.

1=A
2=B
26=Z
27=AA
28=AB....

Can anybody help.
Chris
0
Comment
Question by:chriswies
  • 6
  • 3
  • 2
  • +1
12 Comments
 
LVL 6

Accepted Solution

by:
PaultheBroker earned 2000 total points
ID: 20338451
I've done this as a function as requested, but could also just be included in the SQL
CREATE FUNCTION dbo.ColHeader_fn
	( @Int 	integer )
RETURNS varchar(2)
AS
BEGIN
	DECLARE @ColHeader varchar(2)
	if @int>26 set @ColHeader = char(64+@int/26) + char(64+@int-(26*(@int/26)))
	else set @ColHeader = char(64+@int)
RETURN @ColHeader
END
 
--USAGE
select dbo.ColHeader_fn(43)

Open in new window

0
 
LVL 18

Expert Comment

by:Yveau
ID: 20338457
Try this:

Hope this helps ...
declare @Y int
set     @Y = 55
 
select  @Y
,       case
            when @Y <= 26 then char(@Y+64)
            else char(((@Y-1)/26)+64) + char(((@Y-1)%26)+65)
        end

Open in new window

0
 
LVL 6

Expert Comment

by:PaultheBroker
ID: 20338467
Here is the SQL (assuming the table column with the Excel ColumnID is called [Integer]
[ColHeader] = 
case when [Integer] > 26 then char(64+[Integer]/26) + char(64+[Integer]-(26*([Integer]/26)))
	else char(64+@int) end

Open in new window

0
 [eBook] Windows Nano Server

Download this FREE eBook and learn all you need to get started with Windows Nano Server, including deployment options, remote management
and troubleshooting tips and tricks

 

Author Comment

by:chriswies
ID: 20338481
amazing, great
thank you Yveau
0
 
LVL 6

Expert Comment

by:PaultheBroker
ID: 20338516
hmmmph !
0
 

Author Comment

by:chriswies
ID: 20338547
hmmmmph!
understand, that was my fault.
Actually I want to go with the function. I hit accept on the 2nd last and that was not your solution. I didn't see your 2nd post at that time.
What is EE rule for that?
How can I go from here?
Chris
0
 
LVL 6

Expert Comment

by:PaultheBroker
ID: 20338616
Thanks for that....!!  I think you need to post a question in the Community Support, asking the Moderator to change the point allocation.  Include a link to your original question.
0
 
LVL 18

Expert Comment

by:Yveau
ID: 20338632
0
 
LVL 6

Expert Comment

by:PaultheBroker
ID: 20343449
From Yveau's solution I notice the use of the % operand - I was looking for hte MOD function - and now I've found it!!  For completeness, I've updated my solution to incorporate my new found knowledge !!!   It actually makes the equation nice and symmetrical :)  BTW: did you ever get anywhere on having the point allocation changed???
-----------------
CREATE FUNCTION dbo.ColHeader_fn
      ( @Int       integer )
RETURNS varchar(2)
AS
BEGIN
      DECLARE @ColHeader varchar(2)
      if @int>26 set @ColHeader = char(64+@int/26) + char(64+@int%26)
      else set @ColHeader = char(64+@int)
RETURN @ColHeader
END
0
 
LVL 1

Expert Comment

by:Vee_Mod
ID: 20345574
Re-opened at Asker request.


Vee_Mod
Experts Exchange Moderator
0
 
LVL 6

Expert Comment

by:PaultheBroker
ID: 20345656
Call me a perfectionist, but the IF..THEN... (or case ...when) statement has been bugging me as being somehow 'inelegant'.  So I've reworked it slightly so the whole operation is performed in a single operation.....enjoy!
ALTER FUNCTION dbo.ColHeader_fn
      ( @Int       integer )
RETURNS varchar(2)
AS
BEGIN
      DECLARE @ColHeader varchar(2)
	SET @ColHeader =REPLACE(char(64+@int/26) + char(64+@int%26),char(64),'')
RETURN @ColHeader
END

Open in new window

0
 

Author Comment

by:chriswies
ID: 20917885
Hi,
I received a but report from a user that had a column 52 which is AZ but the function deliviered B@.
So I reviewed the function and found that actually the logic of Yveau brings up the right col.
Thanks Yveau!!

That is how the function looks right now:
CREATE FUNCTION dbo.ColHeader_fn3
      ( @Int       integer )
RETURNS varchar(2)
AS
BEGIN
      DECLARE @ColHeader varchar(2)
      if @int>26 set @ColHeader = char(((@int-1)/26)+64) + char(((@int-1)%26)+65)
      else set @ColHeader = char(64+@int)
RETURN @ColHeader
END
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article shows gives you an overview on SQL Server 2016 row level security. You will also get to know the usages of row-level-security and how it works
A Stored Procedure in Microsoft SQL Server is a powerful feature that it can be used to execute the Data Manipulation Language (DML) or Data Definition Language (DDL). Depending on business requirements, a single Stored Procedure can return differe…
This video shows, step by step, how to configure Oracle Heterogeneous Services via the Generic Gateway Agent in order to make a connection from an Oracle session and access a remote SQL Server database table.
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.
Suggested Courses

810 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question