2013-06-11 17 views

Odpowiedz

52

Spróbuj tego:

select COALESCE(sum(balance),0) from mytable where customer = 'john' 

ten powinien wykonać pracę. Metoda koalescencji powinna zwracać wartość 0.

+3

COALESCE jest o wiele lepiej tutaj niż isnull –

+0

@ScottSelby: Jak to? AFAIK, 'isnull' jest bardziej przewidywalny, ponieważ zawsze zwraca typ danych pierwszego argumentu. – Andomar

+0

@Andomar "Wyrażenie zawierające ISNULL z parametrami innymi niż NULL jest uważane za NIE JEST NULL, natomiast wyrażenia zawierające COALESCE z parametrami innymi niż NULL są uważane za NULL" - zawsze używam COALESCE, zawsze będzie to miało wartość zerową, nawet jeśli saldo nie jest zerowalne –

8

To nie jest problem. Jeśli nie ma wierszy, sum() zwróci null. Zwróci także null, jeśli wszystkie wiersze mają saldo null.

Aby powrócić do zera zamiast próbować:

select isnull(sum(balance),0) from mytable where customer = 'john' 
+0

będzie to również powrót 'null' jeśli jeden z rzędów mają' null' bilans – pcv

+0

To jest dokładnie to, co potrzebne, aby wiedzieć, to znaczy jeśli 'null' jest zwracane przez' sum' w przypadkach, gdy liczba rekordów wynosi 0. +1, podając przyczynę tego zachowania. –

1
select coalesce(sum(coalesce(balance,0)),0) from mytable where customer = 'john' 
+0

To byłaby poprawka, gdyby OP wykorzystywał Oracle i gdyby istniał rekord z saldem "zerowym", w przeciwieństwie do braku rekordów. – Andomar

+0

Niestety, nie zauważyłem, że używa on SQL Server. Zmienię go tak, aby był zgodny z większością implementacji. –

+0

Potrzebowałem umieścić opakowanie COALESCE wokół SUMA, jeśli nie ma rekordów i na MySQL. –

1

Spróbuj tego:

select sum(IsNull(balance,0)) from mytable where customer = 'john' 
+0

To byłaby poprawka, gdyby był rekord z saldem zerowym, w przeciwieństwie do braków rekordów – Andomar

+0

'jeśli klient nie ma salda' nie było jasne, czy nie ma rekordu LUB jest rekord, ale saldo jest NULL –

1

Może myślisz o zachowaniach COUNT?

COUNT(Field) zwróci 0, ale SUM(Field) zwróci NULL, jeśli nie ma pasujących wierszy.

Państwo potrzebować ISNULL lub COALESCE

COALESCE lub ISNULL

+0

dlaczego the ratedown? – bendataclear

+0

COUNT zwraca inną wartość 0 - co oznacza, że ​​istnieje zero wierszy pasujących do zapytania, jeśli są 2 wiersze, to liczba będzie zwracana 2, a nie suma 2 wierszy –

+0

@ScottSelby, przepraszam, może nie było jasne, miałem na myśli, że może myślę o 'COUNT' jako zwracającym zero, jeśli nie ma pasujących wierszy, nie, że' COUNT' jest zamiennikiem dla 'SUMA'. – bendataclear

Powiązane problemy