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

Trả lời

78

Nếu cột có giá trị 0, bạn ổn, tôi đoán bạn có vấn đề với giá trị Null, trong trường hợp đó bạn cần phải sử dụng IsNull(Column, 0) để đảm bảo giá trị này luôn bằng 0.

+0

Cảm ơn Mitchel, tôi gặp sự cố với giá trị null. Cảm ơn các đầu vào. – Yves

+0

Yonita là câu trả lời của Michael trả lời câu hỏi của bạn đánh dấu nó như được trả lời bằng cách sử dụng dấu kiểm. – ahsteele

+0

Cảm ơn Ahsteele. – Yves

3

Bạn có thể sử dụng 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

thiếu một ")" trước "AS" –

0

trông giống như bạn muốn tổng hợp tất cả các cột (Tôi không chắc chắn nơi "tổng 3 cột" xuất phát từ), không chỉ TotalHoursM, vì vậy hãy thử này:

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

cảm ơn bạn đã bỏ phiếu xuống gần 8 năm sau khi trả lời câu trả lời này! ha ha, đây là câu trả lời chính xác được đưa ra bởi những người khác về câu hỏi này rất. Tôi trả lời trước họ, nhưng họ có rất nhiều phiếu bầu. –

47

Các câu trả lời trước đây sử dụng chức năng ISNULL là chính xác. Chức năng COALESCE cũng sẽ hoạt động. Trong ví dụ đã cho:

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

Điều này giống hệt với giải pháp ISNULL với sự khác biệt duy nhất là tên của hàm. Một số bất đồng trong thế giới SQL về cái nào là 'tốt hơn'. Nhưng cả hai đều làm việc. Tôi gửi phương án thay thế này vì hai lý do. Các COALESCE là ANSI tiêu chuẩn và ISNULL là không. Nhưng, quan trọng hơn là một thực tế là COALESCE là linh hoạt hơn. ISNULL sẽ chỉ hoạt động với hai tham số. Nếu tham số đầu tiên là NULL thì giá trị của tham số thứ hai được trả về, ngược lại giá trị của tham số đầu tiên được trả về. COALESCE sẽ mất 2 đến 'n' (tôi không biết giới hạn của thông số 'n') và trả lại giá trị của thông số đầu tiên không phải là NULL. Khi chỉ có hai tham số thì hiệu ứng giống như ISNULL.

+1

Ngoài ra, Oracle SQL không có ISNULL. Mặc dù, theo kinh nghiệm của tôi, bạn có thể nhận được kết quả tốt hơn với NVL(): http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm – Darren

+1

Chỉ cần tôi đang tìm kiếm - postgres không có ether isnull. –

+1

Isnull không hoạt động như mong đợi trong MySQL. Coalesce đã làm công việc. Cảm ơn. – George

0

tôi sẽ cố gắng này:

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

Quá bất tiện, xem câu trả lời được chấp nhận .. – Nippey

+0

Tuy nhiên tôi thích giải pháp này vì nó cũng sẽ có thể chăm sóc những trường hợp mà giá trị là trống và không NULL. Bạn sẽ phải thêm LEN()> 0. – webworm

1

Nếu bạn muốn tránh các IsNull sử dụng giá trị null (Cột, 1)

0

Bạn cũng có thể sử dụng nvl(Column,0)

+1

nvl là cụ thể cho oracle pl/sql. – awd

Các vấn đề liên quan