Celebrate National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
Solved

# SQL % Calculation

Posted on 2015-02-06
Medium Priority
136 Views
have a very basic qry  that counts number of active customers vs those customers that have been verified with current data and shows the percent of "verified" accounts.

The date is showing 186 verified out of 325 Active, but my percent results show 39.42 not 57.23

SELECT  COUNT(uppnverify) AS 'Verified GM Customers'
FROM CONTACT2
WHERE UPPNVERIFY like '201%'

SELECT COUNT(ACCOUNTNO)AS 'Active Customers'
FROM CONTACT2
WHERE USALESYTD IS NOT NULL AND USALES2014 IS NOT NULL

SELECT CAST([Verified Customers] * 100.0 / [Active Customers] AS decimal(4, 2)) AS [%age of GM verified customers]
--, [Verified Customers], [Active Customers]
FROM (
SELECT
--count number of GM company with verified field
SUM(CASE WHEN UPPNVERIFY like '201%' THEN 1 ELSE 0 END) AS [Verified Customers],
-- count number of GM company with active status (sales in last 2 yr)
SUM(CASE WHEN USALESYTD IS NOT NULL AND USALES2013 IS NOT NULL THEN 1 ELSE 0 END) AS [Active Customers]
FROM CONTACT2
WHERE
(UPPNVERIFY like '2015%') OR
(USALESYTD IS NOT NULL AND USALES2014 IS NOT NULL)
) AS subquery1
0
Question by:Jeremy Kirkbride
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• Learn & ask questions
• 2
• 2

LVL 27

Expert Comment

ID: 40593645
Your WHERE clause uses (UPPNVERIFY like '2015%') which may be excluding results you are expecting with just (UPPNVERIFY like '201%').
0

Author Comment

ID: 40593845
Gotcha, changed the statement to 201%, the percentage is much closer but still calculating 59.6, math has never been my strong point, but I get 57% from 186 out of 325

SELECT  COUNT(uppnverify) AS 'Verified GM Customers'
FROM CONTACT2
WHERE UPPNVERIFY like '201%'

SELECT COUNT(ACCOUNTNO)AS 'Active Customers'
FROM CONTACT2
WHERE USALESYTD IS NOT NULL AND USALES2014 IS NOT NULL

SELECT CAST([Verified Customers] * 100.0 / [Active Customers] AS decimal(4, 1)) AS [%age of GM verified customers]
--, [Verified Customers], [Active Customers]
FROM (
SELECT
--count number of GM company with verified field
SUM(CASE WHEN UPPNVERIFY like '201%' THEN 1 ELSE 0 END) AS [Verified Customers],
-- count number of GM company with active status (sales in last 2 yr)
SUM(CASE WHEN USALESYTD IS NOT NULL AND USALES2013 IS NOT NULL THEN 1 ELSE 0 END) AS [Active Customers]
FROM CONTACT2
WHERE
(UPPNVERIFY like '201%') OR
(USALESYTD IS NOT NULL AND USALES2014 IS NOT NULL)
) AS subquery1
0

LVL 69

Accepted Solution

Scott Pletcher earned 2000 total points
ID: 40593908
The calc will work, since computers don't mess up simple math :-).

Uncomment the other values in the outer query and you can see the actual totals SQL is using, which will differ from your expected totals of 186 and 325 somewhat, which will explain the difference in %.

SELECT CAST([Verified Customers] * 100.0 / [Active Customers] AS decimal(4, 1)) AS [%age of GM verified customers]
, [Verified Customers], [Active Customers]

Edit: Just saw the data conflict in the query:
...
SUM(CASE WHEN USALESYTD IS NOT NULL AND USALES2013 IS NOT NULL THEN 1 ELSE 0 END) AS [Active Customers]
FROM CONTACT2
WHERE
(UPPNVERIFY like '201%') OR
(USALESYTD IS NOT NULL AND USALES2014 IS NOT NULL)
0

LVL 27

Expert Comment

ID: 40593912
Another WHERE Clause discrepancy:
SUM(CASE WHEN USALESYTD IS NOT NULL AND USALES2013 IS NOT NULL THEN 1 ELSE 0 END)

versus:
(USALESYTD IS NOT NULL AND USALES2014 IS NOT NULL)

Looks like your result set may not be returning the records you are expecting.
0

Author Closing Comment

ID: 40594062
Thanks so much. All good now
0

## Featured Post

Question has a verified solution.

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

In this article we will learn how to fix  “Cannot install SQL Server 2014 Service Pack 2: Unable to install windows installer msi file” error ?
An alternative to the "For XML" way of pivoting and concatenating result sets into strings, and an easy introduction to "common table expressions" (CTEs). Being someone who is always looking for alternatives to "work your data", I came across this …
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.
Via a live example, show how to extract information from SQL Server on Database, Connection and Server properties
###### Suggested Courses
Course of the Month11 days, 13 hours left to enroll

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

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