2009-09-07 78 views
11

Tôi muốn lấy tổng của một số cột từ 2 bảng khác nhau (các bảng này có cùng cấu trúc).Lấy tổng của một số cột từ hai bảng

Nếu tôi chỉ xem xét một bảng, tôi sẽ viết loại truy vấn:

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
    FROM T_FOO 
    WHERE seller = XXX 
    GROUP BY MONTH_REF; 

Tuy nhiên, tôi muốn cũng làm việc với các dữ liệu từ T_BAR bảng, và sau đó có một truy vấn select trả lại các cột sau:

  • MONTH_REF
  • SUM (T_FOO.amount1) + SUM (T_BAR.amount1)
  • SUM (T_FOO.amount2) + SUM (T_BAR.amount2)

mọi thứ được nhóm theo giá trị MONTH_REF.

Lưu ý rằng một bản ghi cho một MONTH_REF đã cho có thể được tìm thấy trong một bảng nhưng không có trong bảng khác. Trong trường hợp này, tôi muốn nhận tổng của T_FOO.amount1 + 0 (hoặc 0 + T_BAR.amount1).

Làm cách nào để tôi có thể viết truy vấn SQL của mình để nhận thông tin này?

Để biết thông tin, cơ sở dữ liệu của tôi là Oracle 10g.

Trả lời

12

Bạn có thể kết hợp bảng của bạn trước khi nhóm bằng (điều này là trên Oracle , bằng cách này):

SELECT t.month_ref, SUM(t.amount1), SUM(t.amount2) 
    FROM (SELECT month_ref, amount1, amount2 
      FROM T_FOO 
     WHERE seller = XXX 
     UNION ALL 
     SELECT month_ref, amount1, amount2 
      FROM T_BAR 
     WHERE seller = XXX 
     ) t 
GROUP BY t.month_ref 

bạn cũng có thể kết hợp các bảng với lĩnh vực bán và lọc theo nó sau này (trong trường hợp bạn cần logic nâng cao hơn):

SELECT t.month_ref, SUM(t.amount1), SUM(t.amount2) 
    FROM (SELECT month_ref, amount1, amount2, seller 
      FROM T_FOO 
      UNION ALL 
     SELECT month_ref, amount1, amount2, seller 
      FROM T_BAR) t 
    where t.seller = XXX 
    GROUP BY t.month_ref 
+0

Cuối cùng tôi thích giải pháp của bạn (đầu tiên) vì nó là rõ ràng hơn so với các giải pháp Lieven ... – romaintaz

+0

Đầu tiên là nhiều hơn hiệu quả bởi vì bạn đang giảm số hàng sớm hơn khi bạn di chuyển mệnh đề 'WHERE' bên ngoài phần tử' SELECT'. – JohnB

+0

Cảm ơn tôi đã sử dụng thứ hai. –

2

Bạn đã thử sử dụng công đoàn chưa?

SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) AS amount1, SUM(amount2) as amount2 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
+0

@romaintaz: không sao cả. Một câu hỏi, bạn đã lược tả các giải pháp khác nhau chưa? Tôi giả sử rằng * nhóm theo - union - grouping by * sẽ nhanh hơn trên các tập dữ liệu lớn hơn là chỉ * union - grouping by * solution. –

1

Ngoài ra, một bên ngoài tham gia cũng nên làm việc:

SELECT month_ref, 
     SUM(t_foo.amount1) + SUM(t_bar.amount1), 
     SUM(t_foo.amount2)+SUM(t_bar.amount2) 
FROM t_foo FULL OUTER JOIN t_bar 
     ON t_foo.month_ref = t_bar.month_ref 
GROUP BY month_ref 
+0

Truy vấn này mất quá nhiều thời gian (đặc biệt là so với câu trả lời của Lieven), và ngoài ra nó trả về kết quả sai. Nó cũng cần NVL (SUM (...), 0) nếu không tôi sẽ nhận được giá trị null ... – romaintaz

1

cuối cùng tôi đã có được điều này làm việc bằng câu trả lời 's Lieven.

Đây là mã chính xác (amount1 = ... không hoạt động trên môi trường của tôi, và có quá nhiều ; trong truy vấn):

SELECT MONTH_REF, SUM(sumAmount1), SUM(sumAmount2) 
FROM (
    SELECT MONTH_REF, SUM(amount1) as sumAmount1, SUM(amount2) as sumAmount1 
     FROM T_FOO 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
    UNION ALL SELECT MONTH_REF, SUM(amount1), SUM(amount2) 
     FROM T_BAR 
     WHERE seller = XXX 
     GROUP BY MONTH_REF 
) tmp 
GROUP BY MONTH_REF 
-1
SELECT (SELECT SUM(amount) from debit) as debitamounts, (SELECT SUM(amount) from credit) as creditamounts 
+0

Vui lòng thêm một số nhận xét về giải pháp của bạn về lý do và cách giải quyết vấn đề –

+0

Lệnh này chưa hoàn thành .... – taboubim

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