Dzielenie przez zero w MS SQL- brak iferror

0

Witam,
Zwracam się z ogromną prośbą o podpowiedź. Jestem samoukiem jeśli chodzi o SQL. więc robię to małymi krokami....
Mam zagwozdkę, gdyż muszę obliczyć dynamiki okres do okresu z wybranych lat i niestety przez to, że mam gdzieniegdzie w sumie 0 i zapytanie się wykrzacza. Nie mam pojęcia jak to obejść. Próbowałam już róznych kombinacji..... Ale ciągle nie tak.... Prośba ogromna o podpowedź. W moim MS SQL nie działą Iferror niestety :(

Składnia jaką teraz próbowałam zrobić:

case when (sum(case when (con.Rok=2016 and con.Miesiąc=11) then [Wartość netto wg dystrybutora] else 0 end)*fil.[split default])<>0 then (sum(case when (con.Rok=2017 and con.Miesiąc=11) then [Wartość netto wg dystrybutora] else 0 end)*fil.[split default]/sum(case when (con.Rok=2016 and con.Miesiąc=11) then [Wartość netto wg dystrybutora]-1 else 0 end)*fil.[split default]) else 0 end

Nadal "divide by zero error encountered."

Próbowałam równiez zadziałać coś z "if coalesce" bo ktoś mi podpowiedział, ale albo źle wpisuję składnie, albo już sama nie wiem :(

Będę wdzieczna za podpowiedzi!

0

W tagach kod wygląda dużo lepiej.

case when (sum(case when (con.Rok=2016 and con.Miesiąc=11) then [Wartość netto wg dystrybutora] else 0 end)fil.[split default])<0 then (sum(case when (con.Rok=2017 and con.Miesiąc=11) then [Wartość netto wg dystrybutora] else 0 end)fil.[split default]/sum(case when (con.Rok=2016 and con.Miesiąc=11) then [Wartość netto wg dystrybutora]-1 else 0 end)*fil.[split default]) else 0 end 

Co do samego divide by zero:
https://stackoverflow.com/questions/861778/how-to-avoid-the-divide-by-zero-error-in-sql
http://www.sql-server-helper.com/error-messages/msg-8134.aspx
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/07c7f911-b29b-433f-ad2f-1f7a66ebe65f/divide-by-zero-error-encountered?forum=transactsql

0

masz błąd w tym case, aby nie dzielić przez 0 sprawdzasz warunek:

(sum(case when (con.Rok=2016 and con.Miesiąc=11) then [Wartość netto wg dystrybutora] else 0 end)*fil.[split default])<>0

a dzielisz przez:

sum(case when (con.Rok=2016 and con.Miesiąc=11) then [Wartość netto wg dystrybutora]-1 else 0 end)*fil.[split default]

Widzisz różnicę?

0

Lepiej, lepiej, ale i tak strasznie. To powinno być (przez autora) rozbite na linie, żeby dało się czytać. Nie wolno pisać takich niezrozumiałych molochów - chyba że z premedytacją, na złość tym, którzy będą to utrzymywać. Ale wtedy i tak trzeba poprawić przed wysłaniem na forum. Sformatowałem to jak należy, ale nie rozumiem tej składni (przed fil.). A może tu brakuje jakiegoś operatora?

    CASE WHEN
      ( SUM(CASE WHEN (con.Rok=2016 AND con.Miesiąc=11)
            THEN [Wartość netto wg dystrybutora]
            ELSE 0 END)
        * fil.[split DEFAULT]
      ) < 0
    THEN (
      SUM(CASE WHEN (con.Rok=2017 AND con.Miesiąc=11)
          THEN [Wartość netto wg dystrybutora]
          ELSE 0 END)
      * fil.[split DEFAULT]
      / SUM(CASE WHEN (con.Rok=2016 AND con.Miesiąc=11)
            THEN [Wartość netto wg dystrybutora]-1
            ELSE 0 END)
      * fil.[split DEFAULT]
    ) ELSE
      0
    END

Jak sobie zapytanie napiszesz ładnie i czytelnie, to od razu widać, czemu nie działa. Blok dzielnika jest inny niż to w if.

0

Tak, przepraszam bardzo za "moloch". To był mój pierwszy post, już nie popełnię tego błędu następnym razem.

Samym zamysłem tej formuły było to,że jeżeli:

Wartość w 2016/11 jest różna od 0 wtedy dzielimy 2017/2016 i wylicza się dynamika (stąd-1)

0

To całe zapytanie:

case when (sum(case when (con.Rok=2016 and con.Miesiąc=11) then [Wartość netto wg dystrybutora] else 0 end)*fil.[split default])<>0
then (sum(case when (con.Rok=2017 and con.Miesiąc=11) then [Wartość netto wg dystrybutora] else 0 end)*fil.[split default])/sum(case when (con.Rok=2016 and con.Miesiąc=11) then [Wartość netto wg dystrybutora] else 0 end)*fil.[split default] -1 else 0 end

Chcę uzyskać efekt. Jeżeli:

case when (sum(case when (con.Rok=2016 and con.Miesiąc=11) then [Wartość netto wg dystrybutora] else 0 end)*fil.[split default])<>0

to podziel 2017/2016 -1 (żeby była to dynamika a nie % roku, jak przy formule w excelu)

0

No ale ta formula to robi, aby nie pisać tak zawiłych case-ów przygotuj sobie dane i rób na nich obliczenia, bo zaczynasz się gubić:
http://sqlfiddle.com/#!18/c3ac9/15

UPDATE:
Albo napisz funkcje do liczenia tej dynamiki:
http://sqlfiddle.com/#!18/6bee8/4

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