Solved

How to make computed column that concatenates year and month columns but shows months as 2 digits

Posted on 2011-03-11
12
702 Views
Last Modified: 2012-05-11
In Sql Server 2008 query...

How do I create a computed column that will  concatenate contents  of two integer columns into a new integer

here are the 2 existing columns

Year  Month  
2009    1
2009    2
2009    3
....
2009   10
2009   11
2009   12

I want the computed column to show

Year  Month  Computed Period
2009    1                200901
2009    2                200902
2009    3                200903
....
2009   10               200910
2009   11               200911
2009   12               200912


I need it to add a leading zero to any month with single digit.

I'd like to use this computed column in the Select statement and Where statement

Thx
0
Comment
Question by:bigmikey88
  • 5
  • 4
  • 3
12 Comments
 
LVL 52

Accepted Solution

by:
_agx_ earned 500 total points
ID: 35112779
select cast(yearCol as varchar(4)) + right('0'+ cast(monthCol as varchar), 2)  AS ComputedPeriod
from   SomeTable
0
 
LVL 52

Expert Comment

by:_agx_
ID: 35112812
I'd put it into a VIEW, so it could be re-used.  Then use the VIEW in your query instead of the table.

... 200910

You might also consider making it a date. Then you can use date functions

SELECT convert(datetime,   CAST(yearCol as varchar(4)) +'-'+  RIGHT('0'+ CAST(monthCol as varchar), 2) +'-01', 120) AS FirstDayOfPeriod
FROM	SomeTable

Open in new window

0
 
LVL 22

Expert Comment

by:8080_Diver
ID: 35113045
Why not just use:
<code>
CONVERT(VarChar(06), yourdatecolumn, 112) AS Computed_Period
</code>
0
 
LVL 22

Expert Comment

by:8080_Diver
ID: 35113054
Sorry, missed the 2 separate columns. :-/  Why do poeple do that? ;-)
0
 
LVL 52

Expert Comment

by:_agx_
ID: 35113241
Yeah, I prefer date/time columns too. Makes it much easier to convert to whatever format you need.
0
 

Author Comment

by:bigmikey88
ID: 35113281
As to why use a separate column for year and month, someone suggested that here at experts-exchange and I am trying to see if it makes life easier.

I will experiment with the suggestions here and get back to you.

Thx for the help.
0
PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

 

Author Comment

by:bigmikey88
ID: 35113424
_agx_

Once I get ComputedPeriod  which is now varchar, how can I convert it to an integer, so I can use it in the WHERE clause.

0
 

Author Comment

by:bigmikey88
ID: 35113522
here is the query but I keep getting an error

<cfquery name="GetEarnings" datasource="mydb"  dbtype="ODBC">
SELECT  Period_Year, Period_Month, Amount AS Earnings,  cast(Period_Year as varchar(4)) + right('0'+ cast(Period_Month as varchar), 2)  AS ComputedPeriod
FROM   mytable
Where  ComputedPeriod >= #StartPeriod# AND ComputedPeriod <= #EndPeriod#
Order By Period_Year, Period_Month
</cfquery>
0
 

Author Comment

by:bigmikey88
ID: 35113578
this works

guess i could not use the computed column value in the where clause

<cfquery name="GetEarnings" datasource="mydb" dbtype="ODBC">
SELECT  Period_Year, Period_Month, Amount AS Earnings,  cast(Period_Year as varchar(4)) + right('0'+ cast(Period_Month as varchar), 2)  AS ComputedPeriod
FROM   mytable
Where AFID = '#Session.AFID#' AND
cast(Period_Year as varchar(4)) + right('0'+ cast(Period_Month as varchar), 2)  >= #StartPeriod# AND
cast(Period_Year as varchar(4)) + right('0'+ cast(Period_Month as varchar), 2)  <= #EndPeriod#

Order By Period_Year, Period_Month
</cfquery>
0
 
LVL 52

Expert Comment

by:_agx_
ID: 35113668

Like I said, you'd be better off creating a VIEW with this computed column.  Then use the VIEW in your query just like any other table

       WHERE ComputedPeriod  = '201109'

guess i could not use the computed column value in the where clause

No, you just need to convert it back to an integer like you thought.

ie
WHERE cast(
                 cast(Period_Year as varchar(4)) + right('0'+ cast(Period_Month as varchar), 2)  
                 AS integer) >= #someValue#
... etc...

BUT it's getting pretty convoluted at this point.  It seems like you're trying force numeric columns to act as date columns.  Based on your last 2 questions, I'd say you should be using a date/time column instead.
0
 
LVL 22

Expert Comment

by:8080_Diver
ID: 35117730
You could also wrap the basic query you created as the data source for an outer SELECT {list of columns} and then you could use the computed column in your where clause.  It is sort of like using a view but it doesn't involve actually creating a view.
0
 
LVL 52

Expert Comment

by:_agx_
ID: 35118674
True, a derived table works too. I got the impression there were multiple queries involved. In which case a single re-usable view might be better.  But ultimately it might be a  moot point.  From their last two questions it sounds like they'd be better off using a single date/time column instead of two separate numeric columns.
0

Featured Post

Enterprise Mobility and BYOD For Dummies

Like “For Dummies” books, you can read this in whatever order you choose and learn about mobility and BYOD; and how to put a competitive mobile infrastructure in place. Developed for SMBs and large enterprises alike, you will find helpful use cases, planning, and implementation.

Question has a verified solution.

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

Suggested Solutions

Why is this different from all of the other step by step guides?  Because I make a living as a DBA and not as a writer and I lived through this experience. Defining the name: When I talk to people they say different names on this subject stuff l…
Slowly Changing Dimension Transformation component in data task flow is very useful for us to manage and control how data changes in SSIS.
Via a live example, show how to extract information from SQL Server on Database, Connection and Server properties
Via a live example, show how to setup several different housekeeping processes for a SQL Server.

867 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

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now