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
Solved

% of duplicate recrods grouped per representative and vendor

Posted on 2009-07-15
6
219 Views
Last Modified: 2012-05-07
Some helpfull soul has pointed me in the right direction with the code below to calcluate the % of records with a duplicate serial number in a given table.  Now i want to take this further and calcuolate the % of duplicate serial numbers per representative which is a field in the source view.
I want to end up with one result record per Vendor and then grouped by Representative with the % of duplicate serial #.
The reason i need this si to do some service KPI's to see how many times a representative has to go back to the same equipment to fix it in a 90 day period (which is already filltered using getdate in the view)

To complicate things further there needs to another tier in the sp that groups by Vendor # which is also a field in the view
the tiers need to be
Representative vendor # Duplicate %
The two new field names exact names are  REPRESENTATIVE  AND  VENDOR

Thank you for looking
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Anthony Cardullo
-- Create date: 07/14/09
-- Description:	<Description,,>
-- EXEC [dbo].[usp_CallBackPerSerialNum90Days]
--============================================
	ALTER PROCEDURE [dbo].[usp_CallBackPerSerialNum90Days]
        -- Add the parameters for the stored procedure here
        
AS
 
SET NOCOUNT ON
 
 
/* declare all variables */
DECLARE @numTotal int
DECLARE @numUnique int
DECLARE @numUnqDupes int
DECLARE @numDupes int
DECLARE @numSingles int
DECLARE @pctDupeEntries float
DECLARE @pctUnqDupes float
DECLARE @pctExtra float
 
 
/* get counts from database */
 
SET @numTotal = (SELECT COUNT(*) FROM ServiceCalls90DaysNoVendor)
 
SET @numUnique = (SELECT COUNT(DISTINCT SERIAL) FROM ServiceCalls90DaysNoVendor)
 
SET @numUnqDupes = (SELECT COUNT(*)
        FROM (SELECT SERIAL, COUNT(SERIAL) as NumSERIAL FROM ServiceCalls90DaysNoVendor GROUP BY SERIAL) TT
        WHERE TT.NumSERIAL > 1
  )
 
SET @numDupes = (SELECT COUNT(*) FROM ServiceCalls90DaysNoVendor WHERE SERIAL IN (
        SELECT SERIAL
        FROM (SELECT SERIAL, COUNT(SERIAL) as NumSERIAL FROM ServiceCalls90DaysNoVendor GROUP BY SERIAL) TT
        WHERE TT.NumSERIAL > 1
    )
  )
SET @pctExtra = (SELECT (CAST((@numTotal-@numUnique) as float)/CAST(@numTotal as float)))
 
 
SET @numSingles = (SELECT (@numTotal - @numDupes))
/* OR */
--SET @numSingles = (SELECT (@numUnique - @numUnqDupes))
/* OR */
--SET @numSingles = (SELECT COUNT(*) FROM
--      (SELECT SERIAL, COUNT(SERIAL) as NumSERIAL FROM ServiceCalls90DaysNoVendor GROUP BY SERIAL) TT
--      WHERE TT.NumSERIAL = 1
--  )
 
 
/* determine percentage of database entries that are non-unique */
SET @pctDupeEntries = (SELECT (CAST(@numDupes as float)/CAST(@numTotal as float)))
 
/* determine percentage of unique serial numbers that exist more than once in database */
SET @pctUnqDupes = (SELECT (CAST(@numUnqDupes as float)/CAST(@numUnique as float)))
 
 
/* choose the percentage you want, then select as your result */
SELECT CAST(@pctDupeEntries*100 as numeric(5,2)) as CallBackPerc
--SELECT @pctDupeEntries as PercentDupes
--SELECT @pctUnqDupes as PercentDupes

Open in new window

0
Comment
Question by:acardullo
  • 3
  • 3
6 Comments
 
LVL 8

Expert Comment

by:Bobaran98
ID: 24860562
Hello again!

Unless there are errors, I think the code below should do exactly what you're wanting.  Note that the percentage I'm using doesn't exactly match the percentages we talked about before (the ones calculated in the codebox above).  Rather I'm calculating percentage of callbacks as the percentage of unique serial numbers for which the serial number exists more than once-- in other words, the percentage of calls that got at least one call back (numUnqDupes divided by numUnique).

Make sense?  Let me know if this runs!

SELECT
 
  TTT.REPRESENTATIVE, TTT.VENDOR,
  CAST(TTT.numUnqDupes as float)/CAST(TTT.numUnique as float) as pctCallbacks
 
FROM (
 
	SELECT DISTINCT
	   
	   R.REPRESENTATIVE,
	   R.VENDOR,	   
 
	   (SELECT COUNT(DISTINCT SERIAL) FROM ServiceCalls90Days WHERE REPRESENTATIVE=R.REPRESENTATIVE AND VENDOR=R.VENDOR) as numUnique,
 
	   (SELECT COUNT(*)
		FROM (SELECT SERIAL, COUNT(SERIAL) as NumSERIAL FROM ServiceCalls90Days GROUP BY SERIAL) TT
		WHERE TT.NumSERIAL > 1 AND REPRESENTATIVE=R.REPRESENTATIVE AND VENDOR=R.VENDOR
	   ) as numUnqDupes
 
	FROM ServiceCalls90Days R
 
) TTT
 
ORDER BY
 
   TTT.REPRESENTATIVE ASC, TTT.VENDOR ASC

Open in new window

0
 

Author Comment

by:acardullo
ID: 24860775
I think you nailed it.  % are a bit whack though.  i have pctCallbacks as high as 2603
0
 

Author Comment

by:acardullo
ID: 24860786
Oh and i cant have any results where the vendor field is empty
0
MIM Survival Guide for Service Desk Managers

Major incidents can send mastered service desk processes into disorder. Systems and tools produce the data needed to resolve these incidents, but your challenge is getting that information to the right people fast. Check out the Survival Guide and begin bringing order to chaos.

 
LVL 8

Accepted Solution

by:
Bobaran98 earned 500 total points
ID: 24861029
Yeah, 2603 doesn't sound quite right, I agree. :-)  I misplaced one of my WHERE clauses above... try the below and see if it works.  I've also added in the non-empty vendor field check too.
SELECT
 
  TTT.REPRESENTATIVE, TTT.VENDOR,
  CAST(TTT.numUnqDupes as float)/CAST(TTT.numUnique as float) as pctCallbacks
 
FROM (
 
	SELECT DISTINCT
	   
	   R.REPRESENTATIVE,
	   R.VENDOR,	   
 
	   (SELECT COUNT(DISTINCT SERIAL) FROM ServiceCalls90Days WHERE REPRESENTATIVE=R.REPRESENTATIVE AND VENDOR=R.VENDOR) as numUnique,
 
	   (SELECT COUNT(*)
		FROM (SELECT SERIAL, COUNT(SERIAL) as NumSERIAL FROM ServiceCalls90Days WHERE REPRESENTATIVE=R.REPRESENTATIVE AND VENDOR=R.VENDOR GROUP BY SERIAL) TT
		WHERE TT.NumSERIAL > 1
	   ) as numUnqDupes
 
	FROM ServiceCalls90Days R
	WHERE ISNULL(R.VENDOR,'')<>''
 
) TTT
 
ORDER BY
 
   TTT.REPRESENTATIVE ASC, TTT.VENDOR ASC

Open in new window

0
 

Author Comment

by:acardullo
ID: 24868425
Youve done it again, Bob!.  Your a credit to this board!
0
 
LVL 8

Expert Comment

by:Bobaran98
ID: 24869331
:-)
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

Suggested Solutions

If you find yourself in this situation “I have used SELECT DISTINCT but I’m getting duplicates” then I'm sorry to say you are using the wrong SQL technique as it only does one thing which is: produces whole rows that are unique. If the results you a…
If you have heard of RFC822 date formats, they can be quite a challenge in SQL Server. RFC822 is an Internet standard format for email message headers, including all dates within those headers. The RFC822 protocols are available in detail at:   ht…
Email security requires an ever evolving service that stays up to date with counter-evolving threats. The Email Laundry perform Research and Development to ensure their email security service evolves faster than cyber criminals. We apply our Threat…

856 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