Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Rozwiązano] Liczenie średniej w SQL z pominięciem "zero"

13 Sty 2020 16:57 306 12
  • Poziom 3  
    Dzień dobry

    Proszę o pomoc doświadczonych użytkowników w temacie stworzenia formuły w SQL dla której liczona będzie średnia ale z pominięciem wartości zero. Wiem, że funkcja AVG nie liczy wartości typu "Null" jednak zera są uwzględniane co fałszuje mi wynik końcowy. Stworzyłem formułę która liczy prawidłowo j.n. niestety liczy też zera które chciałbym pominąć. Dla przykładu wartość końcowa ciśnienia powinna wynosić 22, jednak przez liczenie zer wychodzi mi 19. Jeżeli ktoś zna rozwiązanie proszę o przesłanie.

    SET QUOTED_IDENTIFIER OFF
    SELECT * FROM OPENQUERY(INSQL, "SELECT avg(Aparat\cisnienie)
    FROM AnalogWideHistory
    WHERE wwVersion = 'Latest'
    AND wwRetrievalMode = 'Cyclic'
    AND wwResolution = 1000000
    AND DateTime >= '2015XXXX'
    AND DateTime <= '2015YYYY'")
  • Pomocny post
    Poziom 15  
    Możesz np. użyć NULLIF
    Kod: sql
    Zaloguj się, aby zobaczyć kod

    Ewentualnie konstrukcje z użyciem CASE lub IF, które zamienią 0 na NULL. Możesz także zagnieździć dodatkowe podzapytanie, które odfiltruje wartości 0 ;) możliwości jest wiele.
  • Poziom 3  
    Można podać przykład takiej formuły która odfiltruje zera?
  • Poziom 15  
    Bez znajomości struktury tabeli i celu tych wyliczeń trudno się rozwodzić... ale czy w tym przypadku nie wystarczy po prostu jeszcze dołożenie warunku AND Aparat <> 0 ?
    Sprawdzałeś NULLIF?
  • Poziom 3  
    Dzień dobry

    Po wprowadzeniu zmian j.n.niestety mam błąd QueryError. Może coś źle wpisałem proszę o pomoc.

    SET QUOTED_IDENTIFIER OFF
    SELECT * FROM OPENQUERY(INSQL, "SELECT avg(NULLIF (Aparat\cisnienie), 0)
    FROM AnalogWideHistory
    WHERE wwVersion = 'Latest'
    AND wwRetrievalMode = 'Cyclic'
    AND wwResolution = 1000000
    AND DateTime >= '2015XXXX'
    AND DateTime <= '2015YYYY'")
  • Poziom 15  
    Jak brzmi błąd? Chociaż jakiś numer?
    Warto czytać te komunikaty, bo zazwyczaj odpowiadają na pytanie gdzie jest problem...
    A prawdopodobnie ta konstrukcja powinna wyglądać tak:
    Kod: sql
    Zaloguj się, aby zobaczyć kod
  • Poziom 3  
    Niestety dalej błąd o treści

    Error executing querry: An error occurred while preparing the querry

    SET QUOTED_IDENTIFIER OFF
    SELECT * FROM OPENQUERY(INSQL, "SELECT avg(NULLIF(Aparat\cisnienie, 0))
    FROM AnalogWideHistory
    WHERE wwVersion = 'Latest'
    AND wwRetrievalMode = 'Cyclic'
    AND wwResolution = 1000000
    AND DateTime >= '2015XXXX'
    AND DateTime <= '2015YYYY'")
    for execution against OLE DB provider "INSQL" for linked server INSQL".
    OLE DB provider INSQL" for linked server INSQL" returned message "Incorrect syntax near '(' "".

    Brakuje mi już pomysłów.
  • Poziom 15  
    Widocznie Twoja baza nie posada metody NULLIF (tak btw. to nie napisałeś na czym wgl pracujesz). Wróć do pierwszej wersji zapytania i dodaj kolejny warunek w sekcji WHERE ... AND Aparat <> 0
    Powinno pomóc, jeśli nie interesują Cię rekordy z zerowymi wartościami.
  • Poziom 3  
    Pracuje na historianie w Windows serwer 2012. Próbowałem dać przedzial <>0 też daje błąd. Odnośnie pracy z rekordami możesz podać przykład.
  • Poziom 15  
    Wklej całe zapytanie z tym dodatkowym warunkiem... Jaki błąd wówczas?
  • Poziom 3  
    Ograniczenie w formule z zerem działa. Dziękuję. Pojawil się jednak inny temat - po wprowadzeniu w archestra system management console nowego tagu mam wartość rzeczywista i jest ok natomiast jak wprowadzam do Excela formule ze średnia to mam odpowiedz zero. Na innym tagu wszystko było ok dla tej formuły a teraz mam zero nie wiem gdzie może być błąd.

    Dodano po 1 [minuty]:

    Chodzi o tą formule
    SET QUOTED_IDENTIFIER OFF
    SELECT * FROM OPENQUERY(INSQL, "SELECT avg(Aparat\cisnienie)
    FROM AnalogWideHistory
    WHERE wwVersion = 'Latest'
    AND wwRetrievalMode = 'Cyclic'
    AND wwResolution = 1000000
    AND DateTime >= '2015XXXX'
    AND DateTime <= '2015YYYY'")

    Na innym tagu mam wartość a na tym nowym zero. W archestra system management console pokazuje wartość rzeczywista
  • Poziom 3  
    Dodam jeszcze, że w ArchestrA System Management Console w zakładce diagnostyka -> "Device Group" przykładowo adres %R128 będący pokazuje wartość REAL w sposób ciągły i wartość zmienia się na bieżąco natomiast formuła SQL w Query j.n.

    SET QUOTED_IDENTIFIER OFF
    SELECT * FROM OPENQUERY(INSQL, "SELECT avg(Aparat\cisnienie)
    FROM AnalogWideHistory
    WHERE wwVersion = 'Latest'
    AND wwRetrievalMode = 'Cyclic'
    AND wwResolution = 1000000
    AND DateTime >= '2015XXXX'
    AND DateTime <= '2015YYYY'")

    daje odpowiedź "0".

    gdzie: Tag "Aparat\cisnienie" -> I/O adres %R128

    Ma ktoś jakiś pomysł?
  • Poziom 3  
    Temat braku liczenia średniej wynikał ze zbyt dużej ilości wprowadzonych adresów do historiana, po usunięciu nieużywanych nagle wspomniana formuła działa. Dziwne rzeczy :-)