Click here to Skip to main content
15,887,302 members
Please Sign up or sign in to vote.
3.06/5 (3 votes)
i am calculating Percentage it giving this error
Divide by zero error encountered.Warning: Null value is eliminated by an aggregate or other SET operation.


SQL
CREATE TABLE #Category (CID INT,CName VARCHAR(50));
CREATE TABLE #Sections (SecID INT,Secnam VARCHAR(50));
CREATE TABLE #ItemMasterFile(CodeItem INT,Descriptionitem VARCHAR(50),SecID INT,CID INT,weight int);
CREATE TABLE #Bigbalprd(BID INT,CodeItem INT,SecID INT,CID INT,Bpqty INT,Entrydate DATETIME , DelID int,Bweight int);
CREATE TABLE #Probale(BID INT,CodeItem INT,prdQTY INT,weight int,Entrydate DATETIME,DelID int);
CREATE TABLE #Emp_Strength(EID INT,SecID INT,QTY int, Entrydate DATETIME);
GO
INSERT INTO #Category VALUES(1,'INDIA'),(2,'INDIA(Cut)'),(3,'Pakistan'),(4,'Pakistan(Cut)')
INSERT INTO #Sections VALUES(1,'HR'),(2,'Baby'),(3,'Ladies'),(4,'Mix Rammage'),(5,'T-Shirst'),(6,'Scrap'),(7,'Scrit'),(8,'Men'),(9,'HHR'),(10,'Sports'),(11,'m-HR'),(12,'M-Baby'),(13,'M-Ladies'),(14,'M-Mix Rammage'),(15,'m--Shirst'),(16,'M-Scrap'),(17,'M-Scrit'),(18,'M-Men'),(19,'M-HHR'),(20,'M-Sports');;

INSERT INTO #ItemMasterFile VALUES(1,'A',1,1,100)
, (2,'B',2,2,100)
, (3,'C',3,3,100)
, (4,'D',4,null,100)
, (5,'e',5,null,100)
, (6,'f',6,null,100)
, (7,'g',4,2,100)
, (8,'h',4,3,100)
, (9,'K',2,2,100)
, (10,'L',4,3,100)
, (11,'M',2,4,100);
INSERT INTO #Bigbalprd VALUES(1,1,1,1,1,'01-06-2019',null,100)
, (2,3,3,3,1,'02-06-2019',null,100)
, (3,4,null,4,1,'03-06-2019',null,100)
, (4,4,null,4,1,'04-06-2019',null,100)
, (4,5,null,4,1,'04-06-2019',null,100);

INSERT INTO #Probale VALUES(1,1,1,100,'01-06-2019',null)
, (2,3,1,200,'02-06-2019',null)
, (3,11,1,200,'03-06-2019',null)
, (4,10,1,200,'08-06-2019',null)
, (3,8,1,200,'03-06-2019',null)
, (4,9,1,200,'08-06-2019',null)
, (4,9,1,200,'08-06-2019',null);

INSERT INTO #Emp_Strength VALUES(1,1,4,'01-05-2019')
, (2,3,5,'02-05-2019')
, (3,3,3,'03-05-2019')
, (4,4,7,'04-05-2019');

DECLARE @StartDate DATETIME, @Enddate DATETIME
SET @StartDate = '01-06-2019'
SET @Enddate = '09-06-2019'

;WITH emp

as
(
select Secnam,ISNULL(sum(e.qty),0) Employee_QTY from #Sections s
left join #Emp_Strength e on s.secid=e.secid
where (Entrydate BETWEEN @StartDate AND @Enddate or Entrydate is null)
group by Secnam
),cte
AS
(
SELECT DISTINCT Sec.Secnam, 
ISNULL(SUM(b1.Bpqty),0)Bigbale_QTY,ISNULL(sum(b1.Bweight),0)Bigbale_Weight,
ISNULL(SUM(b.prdQTY),0)Smallbale_QTY,ISNULL(SUM(case when b.prdQTY is null then 0 else  i.weight end ),0)Small_Bale_weight
--ISNULL(SUM(emp.QTY),0)Employee_QTY
FROM #ItemMasterFile i
LEFT OUTER JOIN #Probale b ON i.CodeItem = b.CodeItem
LEFT OUTER JOIN #Bigbalprd b1 ON i.CodeItem = b1.CodeItem
Full Outer Join #Sections sec on i.SecID=sec.SecID
--left join Emp_Strength emp on emp.SecID = sec.SecID
--FULL OUTER JOIN Sections s ON i.SecID = s.SecID
where (b.DelID is null and b.Entrydate BETWEEN @StartDate AND @Enddate or b.EntryDate is null ) 
and
(b1.DelID is null and b1.EntryDate BETWEEN @StartDate AND @Enddate or b1.EntryDate is Null )

GROUP BY sec.Secnam
),cte1 as ( 
SELECT cte.secnam, Smallbale_QTY,Small_Bale_weight, Bigbale_QTY, Bigbale_Weight, 
( SELECT SUM(val) 
FROM (VALUES (Bigbale_QTY)
, (Smallbale_QTY)

) AS value(val)
) AS Total_QTY,

( SELECT SUM(val) 
FROM (VALUES (Bigbale_Weight),
(Small_Bale_weight )
)AS value(val)
) as Total_Weight,

--For Percentage--

( Select (ISNULL(Small_Bale_weight,0))/((SELECT SUM(val) 
FROM (VALUES (Bigbale_Weight),
(Small_Bale_weight )
)AS value(val)
))*100.0) as Percentage,


coalesce(Employee_QTY,0) Employee_QTY
FROM cte left join emp on cte.secnam=emp.secnam
group by cte.secnam,cte.Smallbale_QTY,cte.Bigbale_Weight,cte.Small_Bale_weight,cte.Bigbale_QTY,emp.Employee_QTY)



select * from cte1
where  Smallbale_QTY+Small_Bale_weight+Bigbale_QTY+Bigbale_Weight+Total_QTY+Total_Weight+Employee_QTY+Percentage<>0


What I have tried:

i tried to used null but it is say isnull require to argument which i tried to adjust Like isnull(A,0) but not getting adjusted..
SQL
--For Percentage--

( Select (ISNULL(Small_Bale_weight,0))/(ISNULL(SELECT SUM(val) 
FROM (VALUES (Bigbale_Weight),
(Small_Bale_weight )
)AS value(val)
))*100.0) as Percentage,
Posted
Updated 3-Jul-19 5:01am
v2
Comments
Richard MacCutchan 2-Jul-19 12:19pm    
Some value is zero. Use the debugger to find out which.
MadMyche 2-Jul-19 14:40pm    
Agreed there is a zero somewhere; normally I'd troubleshoot but the code has too manny formatting (or lack thereof) issues
RedDk 2-Jul-19 16:11pm    
... arghhh! ... man, there's nothing more aggrevating than a poster editing his post without alerting the community participants to his edit. Now my code doesn't pass intellisense ...

[EDIT]
And lomac's headsup had nothing to do with the problem ... and I quit
[END EDIT]

If you want to avoid a division by zero error when using ISNULL then don't choose zero as the substitution for null in the divisor - use 1 instead (as division by 1 is the original value).

However, all of your val values must be null for SUM(val) to return null. We know that isn't the case so that isn't actually your underlying problem.

Look at
Bigbale_Weight + Small_Bale_weight
for secnam = M-Baby, M-HHR, m-HR etc … all zero. You are calculating percentage for all rows in the table

Change the calculation for percentage to handle that fact e.g.
SQL
--For Percentage--
CASE WHEN ISNULL(Bigbale_Weight,0) + ISNULL(Small_Bale_weight,0) <> 0 
    THEN (ISNULL(Small_Bale_weight,0) / ISNULL(Bigbale_Weight + Small_Bale_weight,1 )) * 100.0
    ELSE 0 END AS [Percentage],
Note the square brackets around "Percentage" - that's because it is a reserved word in SQL and shouldn't really be used as a column name (unless surrounded by [ ] ).

I've also simplified the calculation by removing SUM here but your use of the sub-query is arguably better as you wouldn't need the ISNULL I've used. However, I suspect my version is faster.

Finally, I'm upvoting your question because you gave us everything we needed to reproduce the problem - thank you!
 
Share this answer
 
An error message:
Quote:
it is say isnull require t(w)o argument(s)

is self explanatory.

BTW: [w] and [s] have been added by me to correct spellings.

Now, take a look at your code:
SQL
--For Percentage--
( Select (ISNULL(Small_Bale_weight,0))/(ISNULL(SELECT SUM(val)
FROM (VALUES (Bigbale_Weight),
(Small_Bale_weight )
)AS value(val)
))*100.0) as Percentage, ... -- comma and zero are missing
 
Share this answer
 
Comments
akhter86 3-Jul-19 1:18am    
is this way? but still same issue
( Select (ISNULL(Small_Bale_weight,0))/(ISNULL(SELECT SUM(val)
FROM (VALUES (Bigbale_Weight),
(Small_Bale_weight ))AS value(val)
))*100.0,0)) as Percentage,

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900