Is it possible to concatenate after using a Math equation?
I have a simple calculation running like so
Value / 100 * 0.5 + Value as Total Value
example would be 3000 / 100 * 0.50 = 3015.
But I would like to include a star with it.
I.e.
Value / 100 * 0.5 + Value + ' *' as Total Value
to display as 3015 *
However I'm getting an error saying
Error converting data type varchar to numeric.
Is here a way around this? Would it be possible to then convert the total value to a varchar and concatenate the star?
You cannot just concatenate together numerical and string values - so you need to do:
SELECT CAST((Value / 100 * 0.5 + Value) AS VARCHAR(20)) + ' *' as Total Value
First determine your result from your computation, then cast it to a varchar large enough to hold the result, and concatenate that casted string with the star string literal.
Related
I am running the following code to get the length of a value before the decimal place:
SELECT LEN(FLOOR(CAST([VALUE] AS FLOAT))) FROM TABLE1 WHERE VALUE2 <> 'B'
The [VALUE] column in TABLE1 is of type nvarchar(30) hence the cast. The column also contains some non-numeric values but these are filtered out by the WHERE clause as they all have a 'B' value for VALUE2.
The code works as expected and returns '6' for values with 6 digits such as '123456.123'. It also works correctly for values with less than 6 digits. However, the code simply returns '12' for any value with greater than 6 digits such as '12345678'.
I've done some googling and can't seem to find a reason for this? Any explanations / alterations / alternatives would be much appreciated!
LENGTH() function expects string expression, so the float value is implicitly converted to string using scientific notation. The following statement demonstrates this issue and the unexpected result:
SELECT
LEN(FLOOR(CAST([VALUE] AS FLOAT))),
FLOOR(CAST([VALUE] AS FLOAT)),
CONVERT(varchar(50), FLOOR(CAST([VALUE] AS FLOAT)))
FROM (VALUES
(N'12345678')
) TABLE1 ([VALUE])
Result:
12 12345678 1.23457e+007
A possible solution, without using an integer (and/or float) conversion, is the following statement:
SELECT CHARINDEX(N'.', CONCAT([VALUE], N'.')) - 1
FROM (VALUES
(NULL),
(N'12345678'),
(N'123456.123'),
(N'99999.923')
) TABLE1 ([VALUE])
I am running the following code to get the length of a value before the decimal place:
This value is called the log base 10 plus 1 -- at least for numbers greater than 1. So how about using:
floor(log10(value)) + 1
You can tweak this for values less than 1 (including negative values) if that is needed.
I have a field in SQL Server 2014 that I am working with that looks like this:
**RawField**
20060202
20060323
I want to add a split the field and add a decimal point and create a numerical field. This is what I would like to see:
**RawField**
200602.02
200603.23
So I need to split the field, add the decimal point, and convert to a numerical value. I tried some code but was getting an error. Please see my code below:
select top 1000 cast(SUBSTRING(cast(RawField as varchar(6)),1,6) + cast('.' as varchar(1)) + SUBSTRING(cast(RawField as varchar(2)),6,2) as int)
from Table
I get an error of:
Msg 245, Level 16, State 1, Line 11
Conversion failed when converting the varchar value '200602.' to data type int.
Is this a good approach?
you want to convert the string to numeric with 2 decimal places ?
select convert(decimal(10,2), RawField) / 100.0
I guest your RawField contains other alphanumeric after that and you only posted the first 8 characters ?
this should work. Just take the first 8 characters and convert. Simple and direct
select convert(decimal(10,2), left(RawField, 8)) / 100.0
Please try this.
select top 1000 cast(SUBSTRING(cast(RawField as varchar(6)),1,6) + cast('.' as varchar(1)) + SUBSTRING(cast(RawField as varchar(2)),6,2) as numeric(8,2))
from Table
You are trying to cast string with decimal number to int.
Use float/numeric/decimal when casting
select cast(SUBSTRING(RawField ,1,6) + cast('.' as varchar(1)) + SUBSTRING(RawField ,7,2) as numeric(16,2))
I have the following statement within my select clause;
(([Complt_Emp] + [No_Non_Complt_Emp])/ [No_of_Emp]) as Total_Completed
How do I implement CAST "cast(your_float_column as decimal(10,2))" ? I want my column Total_Completed to show 2 decimal places
I cannot seem to get the correct syntax!
Thank you
the result of the calculation depends of the used columns type.
If you divide int columns, you get int result : 1 / 6 = 0
when you convert each values to decimal the result is: 1 / 6 = 0.1666666666666
Now you want 2 decimal result,so you have to convert/ round the previous result to get the expected value
See fiddle for some example of divide and cast / round : http://sqlfiddle.com/#!18/51785/5
An easy trick can be to use :
round ( 1.0 * ( [Complt_Emp] + [No_Non_Complt_Emp] ) / [No_of_Emp] , 2 )
Cast each expression seperately
CAST(([Complt_Emp] + [No_Non_Complt_Emp]) as decimal(10,2)) /
CAST([No_of_Emp] as decimal(10,2)) as Total_Completed
I suspect all your values are INT. An int divided by an int will return an int.
(([Complt_Emp] + [No_Non_Complt_Emp])/ cast([No_of_Emp] as decimal(10,2)) as Total_Completed
Try this
cast((([Complt_Emp] + [No_Non_Complt_Emp])/ [No_of_Emp]) as decimal(10,2)) as Total_Completed
I have a data something like this.
70.6
70.60
70.7
70.70
I can't use varchar as I need to perform arithmetic operations (>,< or floor), when I used float all records change to 70.7 and 70.6 from 70.70 and 70.60
When I changed to decimal(2,2), then all 70.6 records changed to 70.60.
Please suggest which data type suits for me.
Business need to retain 70.6 as it is and 70.60 as it is.
Currently data is in dataware house and stored in varchar.
I am preparing data mart and written query like
Result1 = CASE WHEN Dia = '' OR Dia > 28 OR M.Dia < 6 THEN 'Dia' END,
Result2 = CASE WHEN Width = '' OR Width > 16 OR M.Width < 3 THEN 'Width' END,
Result6 = CASE WHEN Bore] = '' OR FLOOR(LOG10(REVERSE(ABS(M.[Center Bore])+1)))+1 <> 2 THEN 'Bore' END,
From the mathematical point of view, there is no difference between 70.6 and 70.60. If your business rules must treat these values as different values, and you want to also be able to perform mathematical operations of them, you should keep them as decimal in your database, and I suggest adding a tinyint column that will specify the number of decimal digits of the original string value.
create a stored procedure that will get the value as string, calculate the number of decimal digits, convert the string to decimal, and save both of these values into the database.
When selecting the value you convert it to string and manipulate the decimal digits as you please.
You can use Convert(float, **) to convert the data from nvarchar.
I don't think there would be any difference can occur when your data is either 60.6 or 60.60 while performing arithmetic operation (>,< or floor)
select convert(float, '60.6') as val
Output: 60.6
as you mentioned in the comment
because I am checking data have only 1 digit after decimal
Then you can form get such a string using charindex and left.
select left(val, charindex('.', val) + 1) as new_val
from (select '60.6666' as val) as x
Input string : 60.6666
Output String : 60.6
now you can use
convert(float, new_val) as val
like,
select convert(float, left(val, charindex('.', val) + 1)) as val
from (select '60.6666' as val) as x
I try to make IP to country query.
Simplest way is make query like this:
select Country
from dbip
where 8 * power(255,3) +
8 * power(255,2) +
8 * power(255,1) + 8
between FromIPInt and ToIPInt
It works for small Google's IP, but for greater IP:
Arithmetic overflow error converting expression to data type int.
Which other way I can compute it?
CAST is the solution, but you have do put it in the right place :
select Country
from dbip
where cast(255 as bigint) * power(255,3)
+ 255 * power(255,2)
+ 255 * power(255,1)
+ 255
between FromIPInt and ToIPInt
The error Arithmetic overflow error converting expression to data type int occurs if you CAST the whole calculation:
select cast(255 * power(255,3) as bigint)
But not if you cast your first number
select cast(255 as bigint) * power(255,3)
More details about that: https://msdn.microsoft.com/en-us/library/ms187745.aspx
Integer constants greater than 2,147,483,647 are converted to the decimal data type, not the bigint data type.
SQL Server does not automatically promote other integer data types (tinyint, smallint, and int) to bigint.