2 warunki w Where - osobno działają - razem wywala błąd Divided by zero ?!

0

Witam,

ja już zdurniałem całkiem także pomóżcie bo czegoś najwyraźniej nie wiem.

Mam tam jakiś widok z kilkoma tabelami połączonymi ze sobą. Chce wybrać tylko cześć danych z ogólnego zbioru. Wprowadzam warunek w Where spoko daje mi wynik.
Wprowadzam 2 Warunek z OR - błąd "Divide by zero ..."

Sprawdzam zatem tylko 2 warunek ... i znów idzie bez problemu (faktycznie wyliczam nie które pola i dziele .. no ale jakby było dzielenie przez zero to osobno przy którymś z warunków też powinoo być). No to co jest grane ? W końcu z OR ma mi dać dane które spełniają albo 1 albo 2 warunek! Jeśli osobno oba warunki się nie wykrzaczają .. to skąd nagle problem przy ich połączeniu ? Nie kumam.

Dla łatwiejszego zobrazowania:

Przypadek1 - działa

Select jakie, tam, dane
From Tabela1.... N
Where Warunek1

Przypadek2 - działa

Select jakie, tam, dane
From Tabela1.... N
Where Warunek2

Przypadek3 - NIE działa

Select jakie, tam, dane
From Tabela1.... N
Where Warunek1 OR Warunek2 

Z góry dzięki za podpowiedzi.

pozdr.

0

To, że osobno się nie wykrzacza nie oznacza, że z obydwoma warunkami nie będzie. Z pewnością masz dzielenie przez zero, jeżeli baza danych zwraca taki błąd. Sprawdź czy gdzieś w dzielniku nie masz zera.

0

a gdzie masz operator dzielenia który może generować wyjątek? gdzieś po select czy w warunku where ?
najlepiej pokaż całość. Być może jest tak że każdy z warunków użyty pojedynczo tak zawęża zbiór wynikowy że nie ma dzielenia przez zero, a przy sumie logicznej warunków jednak masz błąd

0

logicznie rzecz ujmując (warunek1 or warunek2) powinien dawać wszystkie rekordy z zapytań z po jednym warunków, skoro tak nie jest, to gdzieś popełniasz błąd, ale bez pokazania więcej mogę tylko napisać, że tak masz racje...

2
Select 1/(count(*)-2) from tabela where id=1 or id=2
0

Ok po usunięciu zbędnych kolumn nie wnoszących nic do zapytania, kod wygląda tak:

SELECT  pol.PurchaseOrder, pol.PurchaseOrderLinesPositionNumber1 AS POLine,
ROUND(pol.Amount / (po.RateFactor / po.PurchaseRate), 4) AS AmountEUR,
ROUND((pol.Amount / pol.OrderedQuantity / pol.ConversionFactorPriceToInventor) / (po.RateFactor / po.PurchaseRate), 4) AS PriceInStockUn, 
 pol.OrderedQuantity,
ROUND(pol.Amount / pol.OrderedQuantity / pol.ConversionFactorPriceToInventor, 4) AS PriceInStockUnDocCurrency, 
ROUND(rec.Amount / (po.RateFactor / po.PurchaseRate), 4) AS POReceivedValue,
ROUND(rec.StandardCostP * rec.DeliveredQty, 4) AS StdCostValue

FROM        _PurchaseOrders AS po
 INNER JOIN
                  _PurchaseOrderLines AS pol ON po.PurchaseOrder = pol.PurchaseOrder
 LEFT OUTER JOIN
                  POdeliveredLast2Y AS pod2y ON pol.PurchaseOrder = pod2y.PO AND pol.PurchaseOrderLinesPositionNumber1 = pod2y.POline
 LEFT OUTER JOIN
                  _Receipts AS rec ON pol.PurchaseOrder = rec.PurchaseOrder AND pol.PurchaseOrderLinesPositionNumber1 = rec.ReceiptsPositionNumber1
WHERE     (NOT (pod2y.PO IS NULL)) OR
                  (pol.OrderDate >= CONVERT(date, CAST(YEAR(GETDATE()) - 2 AS nchar(4)) + CAST('-01' AS char(3)) + CAST('-01' AS char(3)), 120))

Do szedłem, że problemem jest dzielenie przez "pol.OrderedQuantity" - przy czym w tej tabeli w tym polu nie występuje nigdzie 0 (nawet poza zakresem który biorę) .... także ja zgłupiałem.

0

jakiego typu są kolumny:
pol.Amount,
pol.OrderedQuantity
pol.ConversionFactorPriceToInventor
po.RateFactor
po.PurchaseRate

0
Panczo napisał(a):

jakiego typu są kolumny:
pol.Amount, - float
pol.OrderedQuantity - float
pol.ConversionFactorPriceToInventor - float
po.RateFactor - int
po.PurchaseRate - float

Podane przy każdym z pól, powyżej.

0

No to wszystko przy dzieleniu będzię float,
Nie pozostaje nic innego jak znaleźć przyczynę, najpierw sprawdź które dzielenie zwraca błąd

Czyli dla każdego działania puszczasz zapytanie np.:

select
      ROUND(pol.Amount / (po.RateFactor / po.PurchaseRate), 4) AS AmountEUR
FROM        _PurchaseOrders AS po
 INNER JOIN
                  _PurchaseOrderLines AS pol ON po.PurchaseOrder = pol.PurchaseOrder
 LEFT OUTER JOIN
                  POdeliveredLast2Y AS pod2y ON pol.PurchaseOrder = pod2y.PO AND pol.PurchaseOrderLinesPositionNumber1 = pod2y.POline
 LEFT OUTER JOIN
                  _Receipts AS rec ON pol.PurchaseOrder = rec.PurchaseOrder AND pol.PurchaseOrderLinesPositionNumber1 = rec.ReceiptsPositionNumber1
WHERE     (NOT (pod2y.PO IS NULL)) OR
                  (pol.OrderDate >= CONVERT(DATE, CAST(YEAR(GETDATE()) - 2 AS NCHAR(4)) + N'-01-01', 120))

jak dojdziesz, które to w where szukasz dzielnika=0

0

@Panczo: ale ja juz to zrobilem :| jak napisałem wcześniej problemem jest pole pol.OrderedQuantity. I jak już wspomniałem przy warunku pol.OrderedQuantity=0 nie zwraca żadnych wyników! (czyli nie ma zera w tej tabeli w tym polu)

0

To pokaż dokładnie które działanie zwraca błąd?

Bo np. dla dzielenia

pol.Amount / pol.OrderedQuantity / pol.ConversionFactorPriceToInventor) / (po.RateFactor / po.PurchaseRate)

Błąd dzielenia przez zero może być dla warunku :

WHERE
pol.OrderedQuantity=0 
or pol.ConversionFactorPriceToInventor=0 
or  po.PurchaseRate =0 
or (po.RateFactor / po.PurchaseRate)=0

wieć dlaczego twierdzisz, że to akurat kolumna OrderedQuantity stanowi problem, skoro sprawdziłeś, że w niej nie ma wartości 0?

0

Bo po usunięciu tej konkretnej kolumny z działania wszystko inne się wylicza poprawnie dla wszytkich wierszy. Stąd taki wniosek wysunąłem.

Ale faktycznie niech no sprawdze czy nie ma gdzieś błędu logicznego w moim myśleniu :)

Edit: Taak dokładnie to działanie:

ROUND((pol.Amount / pol.OrderedQuantity ) , 4) AS PriceInStockUn, 

Zwraca błąd.

1

Diagnozowanie musi być systematycznie przeprowadzone:

  1. Diagnoza wyrażenie generującego błąd
  2. Szukanie problemów w tym konkretnie wyrażeniu

W przeciwnym razie nie przybliżamy się do rozwiązania...

0

Dobra kajam się - jednak jest kilka wierszy z Ordered qty = 0 i to powoduje błąd. Przy sprawdzaniu wcześniejszym użyłem innego źródła (baza produkcyjna) gdzie dane są zafitrowane i nie pokazują bardzo starych danych, a tam właśnie są te zerówki :|

Widać jak używałem warunków osobnie najpierw filtorwał dane do setu gdzie błąd nie występował i wtedy liczył, jak je połączyć szukanie następowało poza wyznaczonym zakresem w warunkach i błąd występował.

Dzięki wszytskim za na prowadzenie, w szczególności @Panczo. Tradycyjnie czeskie błędy rządzą :(

0

Można też uniknąć tego błędu stosując funkcję NULLIF
dzielna/NULLIF(dzielnik, 0)

0

Nigdy tego nie badałem, ale wydaje mi się, że nullif. Świetnie się sprawdza

0

Nullif jeśli chcesz mieć null-a w obliczeniach to tak, czasami jednak trzeba podstawić inny dzielnik np. 1

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