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

Working out percentages in sql

Hi everyone

I have a problem with the code below and I cannot see what is wrong with it.  It compiles but the results are not what they should be.
select week_no,dept_code,count(*) as 'total registers', count(absence_code) as 'registers marked',
cast(((count(absence_code) / count(*) ) * 100) as decimal (10,2)) as '% marked',
((count(*))- (count(absence_code))) as 'registers not marked',
cast(((((count(*))- (count(absence_code))) / count(*) ) * 100) as decimal (10,2)) as '% not marked'

Open in new window


I have total registers, then registers marked, % marked registers, registers not marked and percentage not marked.

The two percentage fields are not working unless the results is 100% if not the answer shown is 0.00

Can anyone see what I am doing wrong thanks
0
lisa_mc
Asked:
lisa_mc
  • 5
  • 4
  • 3
  • +1
1 Solution
 
kingjelyCommented:
Hi at a quick look,

'Could' the reason is because are using decimal eg (10,2)  if it is rounding to 2 decimal places, it will never end up as 100% exactly will it?
0
 
kingjelyCommented:
your also using count not sum(), is this correct?
0
 
lisa_mcAuthor Commented:
Hi

Even if I take that out it still doesn't work

Is the logic correct?

One thing im thinking sometimes the value for registers marked or registers not marked could be zero would that cause a problem as you could be doing this 0/12 * 100

0
Cloud Class® Course: CompTIA Healthcare IT Tech

This course will help prep you to earn the CompTIA Healthcare IT Technician certification showing that you have the knowledge and skills needed to succeed in installing, managing, and troubleshooting IT systems in medical and clinical settings.

 
lisa_mcAuthor Commented:
it has to be count as I am working from a student level
0
 
lisa_mcAuthor Commented:
example of my results at the min

if I have 4 registers with none marked then the percentage marked = 0.00
and the percentage not marked = 100.00

but if I have 15 registers, 2 are marked and 13 are unmakred then my results show
percentage marked = 0.00
percentage unmarked = 0.00
0
 
kingjelyCommented:

Try adding in a check for division by Zero

 
where count(*) <>0
and count(absence_code)  <> 0
0
 
kingjelyCommented:
no worries, glad you got it sorry wasnt much more help im getting ready for work, an im running late too !! ahh cya ;)
0
 
Guy Hengel [angelIII / a3]Billing EngineerCommented:
what about this;
select week_no 
     , dept_code
     , count(*) as 'total registers'
     , count(absence_code) as 'registers marked'
     , cast( cast( count(absence_code)as decimal/10,2) / count(*) * 100.00 ) as decimal (10,2)) as '% marked'
     ,((count(*))- (count(absence_code))) as 'registers not marked'
     , cast(((( cast(count(*)- count(absence_code) as decimal/10,2) ) / count(*) ) * 100.00) as decimal (10,2)) as '% not marked'

Open in new window

0
 
Patrick MatthewsCommented:
The indicated comment, http:#a33699953, does not answer the question.The real answer is that at least one of the operands has to be converted to a non-integer, or else the result will use integer division.  Thus, angelIII's comment http:#a33700104 is the answer.Patrick
0
 
lisa_mcAuthor Commented:
hi matthewspartick

I put up an explanation when I accept my own solution as the answer which was done before 04:16am because at this time kingjely said no worries

my reasoning was that I found this website

http://en.allexperts.com/q/MS-SQL-Server-1801/Dividing.htm

which answered my problem before angelll had left a comment
0
 
Patrick MatthewsCommented:
lisa_mc,With respect, that page you linked to still does not answer the question.Your problem was that you tried to divide the results of two COUNT expressions first, and then convert the quotient into a decimal data type.  That does not work because, as the dividend and divisor are both integers, the quotient will also be an integer.angelIII's comment showed that at least one of the operands has to be implicitly or explicitly converted to a non-integer first.Patrick
0
 
lisa_mcAuthor Commented:
Hi matthewspatrick

WIth respect as well I have attached a line of code from the webpage

But if you make that fix and run, you'll still get 0. Why? The 2nd problem: SQL Server sees
10/22 and says "Aha! An expression of undeclared type. I'll just take the type of the 1st thing I come to as the type to use". So it sees the 10 and say "INTEGER". So 10/22 = 0.454545, which when rounded to an INTEGER is 0.

The fix for the 2nd problem is to make the 10 a decimal or float:
SELECT @Test = 10.0/22
or
SELECT @Test = CAST(10 AS NUMERIC(10.1))/22

That should do it!

If this doesn't fix my problem then why is my problem fixed. Does the text above not state that you should make 10 a decimal or float first because if not stated then sql will take the type of the first statement used which in my case was an integer.

I hope this clears up the confusion of why im accepting my own answer, if not maybe you could explain why
0
 
Guy Hengel [angelIII / a3]Billing EngineerCommented:
matthewspatrick,

 with due respect, but you are wrong there.
 the link DOES show and explain why the 10/22 returns 0, and how to solve it.
 it does not explain that COUNT(...) does return a integer, but that was visibly not blocking the asker understanding and solving the issue, even before my post

angel eyes
0
 
Patrick MatthewsCommented:
Very well, my apologies for delaying the outcome.
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

Cloud Class® Course: Microsoft Azure 2017

Azure has a changed a lot since it was originally introduce by adding new services and features. Do you know everything you need to about Azure? This course will teach you about the Azure App Service, monitoring and application insights, DevOps, and Team Services.

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