Jak SQL wyznaczy średnią z 10 NULL i 20 ?
NULL zostanie pominięte, mamy więc (10+20)/2 = 15
My jednak chcielibyśmy mieć NULL rozpatrywane jako zero: (10 + 0 + 20) / 3 = 10
Jak zaimplementować taką interpretację NULL w raporcie SSRS?
Na początku zakładam tabelę z przykładowymi danymi:
zakładam tabelę z przykładowymi danymi:
use tempdb go create table test ( [year] int, [quarter] int, [value] int ) go insert test values (2018,1,10), (2018,2,20), (2018,3,30), (2018,4,40), (2019,1,100), (2019,2,200), (2019,3,NULL), (2019,4,NULL)
teraz tworzę raport, który pracuje na tych danych, z grupowaniem po roku. Definicja data set:
SELECT [year],[quarter],[value] FROM test
wygląd raportu:
Funkcja Avg rzeczywiście opuszcza NULL i to jest dobrze, bo funkcje agregujące domyślnie tak się w SQL mają zachowywać.
Ponieważ Ty chcesz, aby NULL było równe 0, to wykonuję zmianę:
=Avg(iif(IsNothing(Fields!value.Value),0,Fields!value.Value))
a wynik wygląda tak:
Czyli Avg „widzi” null jak 0 i uwzględnia w liczeniu średniej.
Osobiście „nie lubię” tego jak SSRS interpretuje moje dane i staram się wykonywać konwersje na poziomie zapytania, które znajduje sięw data set. Zamiast:
SELECT [year],[quarter],[value] FROM test
można napisać tak:
SELECT [year],[quarter],ISNULL([value],0) FROM test
wtedy wartości NULL zostaną wyeliminowane na poziomie SQL i SSRS będzie pracował na liczbach (zerach w przypadku NULL)