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

risposta

78

Se la colonna ha un valore 0, si sta bene, suppongo che si sia verificato un problema con un valore Null, in tal caso sarà necessario utilizzare IsNull(Column, 0) per assicurarsi che sia sempre 0 al minimo.

+0

Grazie Mitchel, sto riscontrando problemi con il valore nullo. Grazie per l'input. – Yves

+0

Yonita è la risposta di Michael ha risposto alla tua domanda segna come risposta usando il segno di spunta. – ahsteele

+0

Ahsteele grazie. – Yves

3

È possibile utilizzare 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

manca uno ")" prima del "AS" –

0

sembra si desidera sommare tutte le colonne (non sono sicuro dove "Somma 3 colonne" viene da), non solo TotalHoursM, in modo da provare this:

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

grazie per il voto negativo quasi 8 anni dopo aver risposto a questo! ah ah, questa è esattamente la stessa risposta data da altri su questa stessa domanda. Ho risposto prima di loro, eppure hanno molti voti positivi. –

47

Le risposte precedenti utilizzando la funzione ISNULL sono corrette. Funzionerà anche la funzione COALESCE. Nell'esempio riportato:

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

Questo è identico alla soluzione ISNULL con la sola differenza essendo il nome della funzione. C'è qualche disaccordo nel mondo SQL su cui è "migliore". Ma entrambi funzionano. Invio questa alternativa per due motivi. Lo COALESCE è standard ANSI e non lo è ISNULL. Ma, più importante è il fatto che COALESCE è più flessibile. ISNULL funziona solo con due parametri. Se il primo parametro è NULL, viene restituito il valore del secondo parametro, altrimenti viene restituito il valore del primo. COALESCE impiegherà i parametri da 2 a 'n' (non conosco il limite di 'n') e restituirà il valore del primo parametro che non è NULL. Quando ci sono solo due parametri, l'effetto è lo stesso di ISNULL.

+1

Inoltre, Oracle SQL non ha ISNULL. Sebbene, secondo la mia esperienza, potresti ottenere risultati migliori con NVL(): http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm – Darren

+1

Proprio quello che stavo cercando - postgres non ha isnull ether. –

+1

Isnull non ha funzionato come previsto in MySQL. Coalesce ha fatto il lavoro. Grazie. – George

0

vorrei provare questo:

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

Troppo scomodo, vedere la risposta accettata. – Nippey

+0

Tuttavia mi piace questa soluzione perché sarebbe anche in grado di occuparsi di quei casi in cui il valore è vuoto e non NULL. Dovresti aggiungere il LEN()> 0. – webworm

1

Se si vuole evitare l'uso IsNull valore nullo (Colonna, 1)

0

È anche possibile utilizzare nvl(Column,0)

+1

nvl è specifico per oracle pl/sql. – awd

Problemi correlati