Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

kết hợp truy vấn mysql kết quả SUM () bằng cách sử dụng kết nối bên trong

Đầu tiên xây dựng tổng, sau đó tham gia. Như thế này:

SELECT i.uid
      ,i.date
      ,i.v_in
      ,COALESCE(o.v_out, 0) AS v_out
      ,(i.v_in - COALESCE(o.v_out, 0)) AS balance
FROM (
    SELECT date
          ,uid
          ,SUM(value_in) AS v_in
    FROM   table1
    GROUP  BY 1,2
    ) i
LEFT JOIN (
    SELECT date
          ,uid
          ,SUM(value_out) AS v_out
    FROM   table2
    GROUP  BY 1,2
    ) o USING (date, uid)

Theo cách bạn có, mọi value_in sẽ được kết hợp với mọi value_out phù hợp , do đó nhân các số. Trước tiên, bạn phải tổng hợp và sau đó bạn tham gia một tổng bằng một tổng cộng và mọi thứ đều hấp dẫn. Hay là nó?

Điều gì xảy ra nếu không có value_in hoặc value_out cho một (date, uid) nhất định ? Hoặc chỉ value_in Hoặc chỉ value_out ? Truy vấn của bạn sẽ không thành công.

Tôi đã cải thiện bằng cách sử dụng LEFT JOIN thay vì [INNER] JOIN , nhưng những gì bạn thực sự muốn là một FULL OUTER JOIN - một trong những tính năng còn thiếu trong MySQL.

Bạn có thể cung cấp danh sách các ngày trong một bảng riêng biệt và LEFT JOIN cả hai bảng cho nó hoặc bạn có thể khắc phục tính năng bị thiếu với hai lần LEFT JOINUNION . Xem tại đây cho một ví dụ .

Hoặc bạn có thể nhân value_out của mình bởi -1 UNION cả hai bảng lại với nhau và tạo một tổng.

Nhưng bạn vẫn sẽ không nhận được một hàng trong một ngày mà không có bất kỳ value_in nào hoặc value_out , vi phạm mô tả của bạn.

Vì vậy, giải pháp sạch duy nhất là có một bảng với tất cả (date, uid) bạn muốn trong kết quả và LEFT JOIN tổng của table1table2 với nó, hoặc UNION ALL ba (table2 phủ định ) trong một lựa chọn phụ và sau đó tổng hợp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chia dữ liệu thành các cột trong mysql

  2. Kết quả kỳ lạ cho GROUP_CONCAT trên truy vấn con

  3. Nhiều GROUP_CONCAT trên các trường khác nhau bằng MySQL

  4. Xử lý thời gian và sau nửa đêm

  5. Làm thế nào để triển khai một hệ thống bình luận lồng nhau?