• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1196
  • Last Modified:

How can i sum varchar field.

I have a field in table OpenTrade varchar(21).
data as follows

OpenTrade
---------
12332CR
12222DR
10000CR
10123CR
34133CR
10000CR

Now how can i add this if CR means Minus and DR minus +

0
bcp5190
Asked:
bcp5190
  • 7
  • 5
  • 3
  • +1
1 Solution
 
Scott PletcherSenior DBACommented:
Something like this may do it:

SELECT SUM( CAST(LEFT(openTrade,LEN(openTrade) - 2) AS INT) * CASE WHEN RIGHT(openTrade,2) = 'CR' THEN -1 ELSE 1 END )
FROM table1


0
 
Scott PletcherSenior DBACommented:
I would make it easier, though, by creating a computed column that contained the value and then using that in calculations.  For example:

ALTER TABLE table1
    ADD openTradeValue AS
CAST(LEFT(openTrade,LEN(openTrade) - 2) AS INT) *
    CASE WHEN RIGHT(openTrade,2) = 'CR' THEN -1 ELSE 1 END

Then:

SELECT SUM(openTradeValue) AS 'SumTradeValue'
FROM table1
0
 
bcp5190Author Commented:
In first method i'm geting following error

Syntax error converting the varchar value '         671,875.00' to a column of data type int.
0
Introducing Cloud Class® training courses

Tech changes fast. You can learn faster. That’s why we’re bringing professional training courses to Experts Exchange. With a subscription, you can access all the Cloud Class® courses to expand your education, prep for certifications, and get top-notch instructions.

 
bcp5190Author Commented:
In first method i'm geting following error

Syntax error converting the varchar value '         671,875.00' to a column of data type int.
0
 
Scott PletcherSenior DBACommented:
Oh, didn't realize it had commas in it.  Change to this:

SELECT SUM( CAST(REPLACE(LEFT(openTrade,LEN(openTrade) - 2),',','') AS DECIMAL(12,2)) * CASE WHEN RIGHT(openTrade,2) = 'CR' THEN -1 ELSE 1 END )
FROM table1


0
 
bcp5190Author Commented:
In first method i'm geting following error

Syntax error converting the varchar value '         671,875.00' to a column of data type int.
0
 
bcp5190Author Commented:
I'm getting following error now
Invalid length parameter passed to the substring function.
0
 
bcp5190Author Commented:
I'm getting following error now
Invalid length parameter passed to the substring function.
0
 
Scott PletcherSenior DBACommented:
Do you have some columns that are empty or don't have CR/DR?  Your initial posting of data made it look as if the data was consistent so I assumed that it was.  If it's not, you will have to add another CASE to test for an empty column and/or no CR/DR on the end.
0
 
bcp5190Author Commented:
I'm sorry but here is my actual data
OpenTrade
---------
XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX
0.00
0.00
471,072,451.94CR
991,154,117.94DR
771,072,952.94CR
191,174,987.94DR
271,074,551.94CR
291,173,387.94DR

0
 
bcp5190Author Commented:
I'm sorry but here is my actual data
OpenTrade
---------
XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX
0.00
0.00
471,072,451.94CR
991,154,117.94DR
771,072,952.94CR
191,174,987.94DR
271,074,551.94CR
291,173,387.94DR

0
 
Scott PletcherSenior DBACommented:
Please try this expression for individual row value:

    CASE WHEN RIGHT(openTrade,2) = 'CR'
         THEN CAST(REPLACE(LEFT(openTrade,LEN(openTrade) - 2),',','') AS DECIMAL(13,2)) * -1
         WHEN RIGHT(openTrade,2) = 'DR'
         THEN CAST(REPLACE(LEFT(openTrade,LEN(openTrade) - 2),',','') AS DECIMAL(13,2))
         WHEN ISNUMERIC(openTrade) = 1
         THEN CAST(REPLACE(openTrade,',','') AS DECIMAL(13,2))
         ELSE 0
    END AS OpenTradeValue    

Or this for a total:
SUM(    CASE WHEN RIGHT(openTrade,2) = 'CR'
         THEN CAST(REPLACE(LEFT(openTrade,LEN(openTrade) - 2),',','') AS DECIMAL(13,2)) * -1
         WHEN RIGHT(openTrade,2) = 'DR'
         THEN CAST(REPLACE(LEFT(openTrade,LEN(openTrade) - 2),',','') AS DECIMAL(13,2))
         WHEN ISNUMERIC(openTrade) = 1
         THEN CAST(REPLACE(openTrade,',','') AS DECIMAL(13,2))
         ELSE 0
    END) AS OpenTradeTotal

I would strongly consider making this a computed column, like so:

ALTER TABLE openTrade
    ADD OpenTradeValue AS  
    CASE WHEN RIGHT(openTrade,2) = 'CR'
         THEN CAST(REPLACE(LEFT(openTrade,LEN(openTrade) - 2),',','') AS DECIMAL(13,2)) * -1
         WHEN RIGHT(openTrade,2) = 'DR'
         THEN CAST(REPLACE(LEFT(openTrade,LEN(openTrade) - 2),',','') AS DECIMAL(13,2))
         WHEN ISNUMERIC(openTrade) = 1
         THEN CAST(REPLACE(openTrade,',','') AS DECIMAL(13,2))
         ELSE 0
    END
0
 
killer5Commented:
i have a comment... can u just have 3 fields instead? :D

Debit, Credit, Amount
0
 
killer5Commented:
i have a comment... can u just have 3 fields instead? :D

Debit, Credit, Amount
0
 
killer5Commented:
oops... remove the amount pls. :D just the credit and debit
0
 
mironCommented:
bcp,

are teh XXXX characters also part of data or it was just a way to beautify the presentation. It's kind of important. Now, if it is part of data how do you want it to be treated, as 0.00 ( ZERO ) or your appplication prefers it to be treated as NULL.

Thanks for your comments beforehand.

miron
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 7
  • 5
  • 3
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now