[MSSQL] Divide by zero error encountered

0

Witam,

Mam kodzik:

SELECT * 
FROM (
SELECT
Item.ItemLookupCode,Item.Description, tblResult2.Sold, tblResult2.Received , 
Cast(ROUND(((tblResult2.Sold / tblResult2.Received)*100), 2)as decimal(13,2)) as Percent_sold 

FROM (
     SELECT 
     ItemId, Sum(Received) as Received, Sum(Sold) as Sold 

     FROM (

            SELECT 
              InventoryTransferLog.ItemID, '0' as Sold ,Sum(InventoryTransferLog.Quantity) As Received
            FROM
              InventoryTransferLog where type=1 and InventoryTransferLog.DateTransferred>getDate()-14
            Group by 
              InventoryTransferLog.ItemID

            UNION all

            SELECT
              TransactionEntry.ItemID, Sum(TransactionEntry.Quantity) As Sold, '0' as Received
            FROM
              TransactionEntry
            LEFT JOIN [Transaction] ON [Transaction].TransactionNumber=[TransactionEntry].TransactionNumber
            WHERE 
              [transaction].Time>getDate()-21
            GROUP BY
              TransactionEntry.ItemID

          ) as tblResult
          GROUP BY 
            ItemID

    ) as tblResult2 

LEFT JOIN Item ON tblResult2.ItemID=Item.ID

WHERE Received>0) as tblResult3 <b>where Percent_Sold<25</b>

Wszystko dziala prawidlowo dopuki nie dodam "where Percent_Sold<25" i wlasnie wtedy wyskakuje blad divide by zero.
Zgadzam sie ze w kilku wierszach wystepuje 0 ale to wlasnie te chce wyszczegolnic a reszte odrzucic.

Przepraszam za brak polskich znakow ale pracuje na windowsie bez polskiej klawiatury.

Z gory dziekuje za podpowiedz.

0

Hmm, nie bardzo chce mi się zagłębiać w zapytane, ale czy zamiast kolejnego where nie powinno być AND?

0

Nie wtedy, kiedy dodasz AND ...<25, tylko zawsze, ale byc może wyników nie przewinąłeś dostatecznie daleko, aby ci error wyskoczył. Zresztą - nieważne. Błąd masz tu:
Cast(ROUND(((tblResult2.Sold / tblResult2.Received)*100), 2)as decimal(13,2)) as Percent_sold
dzsielisz przez liczbę, a nie sprawdzasz, czy jest 0. Powinno być -= tak:
case when coalesce(tblResult2.Received,0)<>0 then Cast(ROUND(((tblResult2.Sold / tblResult2.Received)*100), 2)as decimal(13,2)) end as Percent_sold

pozdrawiaMM

0

Wielkie dzieki Marcin, myslalem ze filtr "WHERE Received>0" rozwiaze problem jako ze nie moglo dzielic przez 0 ale nie pomyslalem o Sold.

Jeszcze raz wielkie dzieki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1