2009-07-06 16 views
53
SELECT 
    sum(TotalHoursM) 
      + (TotalHoursT) 
      + (TotalHoursW) 
      + (TotalHoursTH) 
      + (TotalHoursF) 
      AS TOTAL 
FROM LeaveRequest 

Odpowiedz

78

Jeśli kolumna ma wartość 0, oznacza to, że masz problem z wartością Null. W takim przypadku musisz użyć wartości IsNull(Column, 0), aby mieć zawsze minimum 0.

+0

Dziękuję Mitchel, mam problemy z wartością pustą. Dzięki za wejście. – Yves

+0

Yonita jest odpowiedzią Michaela, który odpowiedział na twój znak zapytania jako odpowiadający za pomocą znacznika wyboru. – ahsteele

+0

Ahsteele dzięki. – Yves

3

Można użyć ISNULL:

ISNULL(field, VALUEINCASEOFNULL) 
15
SELECT sum(isnull(TotalHoursM,0)) 
     + isnull(TotalHoursT,0) 
     + isnull(TotalHoursW,0) 
     + isnull(TotalHoursTH,0) 
     + isnull(TotalHoursF,0) 
AS TOTAL FROM LeaveRequest 
+0

brakuje jednego ")" przed "AS" –

0

wygląda chcesz sumują wszystkie kolumny (nie jestem pewien, gdzie "Sum 3 kolumny" pochodzi z), a nie tylko TotalHoursM, więc spróbuj to:

SELECT 
    SUM( ISNULL(TotalHoursM ,0) 
      + ISNULL(TotalHoursT ,0) 
      + ISNULL(TotalHoursW ,0) 
      + ISNULL(TotalHoursTH ,0) 
      + ISNULL(TotalHoursF ,0) 
     ) AS TOTAL 
    FROM LeaveRequest 
+0

dzięki za głosowanie w dół prawie 8 lat po udzieleniu odpowiedzi! ha ha, to jest ta sama odpowiedź udzielona przez innych na to pytanie. Odpowiedziałem przed nimi, ale mają dużo głosów. –

47

Poprzednie odpowiedzi za pomocą funkcji ISNULL są poprawne. Działa również funkcja COALESCE. W danym przykładzie:

SELECT sum(COALESCE(TotalHoursM,0)) 
      + COALESCE(TotalHoursT,0) 
      + COALESCE(TotalHoursW,0) 
      + COALESCE(TotalHoursTH,0) 
      + COALESCE(TotalHoursF,0) AS TOTAL FROM LeaveRequest 

ten jest identyczny z roztworem ISNULL z tą tylko różnicą, nazwa funkcji. Jest pewien spór w świecie SQL, który jest "lepszy". Ale obie działają. Przedstawię tę alternatywę z dwóch powodów. COALESCE jest standardem ANSI, a ISNULL nie jest. Ale ważniejszy jest fakt, że COALESCE jest bardziej elastyczny. ISNULL będzie działać tylko z dwoma parametrami. Jeśli pierwszy parametr ma wartość NULL, zwracana jest wartość drugiego parametru, w przeciwnym razie zwracana jest wartość pierwszego parametru. COALESCE potrwa od 2 do n (nie znam limitu "n") parametrów i zwróci wartość pierwszego parametru, który nie jest NULL. Gdy są tylko dwa parametry, efekt jest taki sam jak ISNULL.

+1

Ponadto Oracle SQL nie ma wartości ISNULL. Jednak z mojego doświadczenia wynika, że ​​możesz osiągnąć lepsze wyniki dzięki NVL(): http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm – Darren

+1

Tylko ten, którego szukałem - postgres nie ma isnull ether. –

+1

Isnull nie działał zgodnie z oczekiwaniami w MySQL. Coalesce wykonał zadanie. Dzięki. – George

0

chciałbym spróbować to:

select sum (case when TotalHousM is null then 0 else TotalHousM end) 
     + (case when TotalHousT is null then 0 else TotalHousT end) 
     + (case when TotalHousW is null then 0 else TotalHousW end) 
     + (case when TotalHousTH is null then 0 else TotalHousTH end) 
     + (case when TotalHousF is null then 0 else TotalHousF end) 
     as Total 
From LeaveRequest 
+3

Zbyt niewygodne, zobacz zaakceptowaną odpowiedź. – Nippey

+0

Jednak lubię to rozwiązanie, ponieważ byłoby również w stanie zająć się tymi przypadkami, w których wartość jest pusta, a nie NULL. Będziesz musiał dodać LEN()> 0. – webworm

1

Jeśli chcesz uniknąć IsNull use wartość zerowa (kolumna 1)

0

Można również wykorzystać nvl(Column,0)

+1

nvl jest specyficzne dla oracle pl/sql. – awd

Powiązane problemy