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

Nhiều kết nối trái với tổng

Vấn đề có thể là do một kết quả Descartes của dữ liệu và tổng kết của bạn đang diễn ra. Chỉ để làm rõ, đây là một truy vấn đơn giản ... Tôi biết tôi không có tất cả, cũng như nối các cột hoàn hảo, điều này chỉ để làm rõ.

CŨNG THẾ, TÔI BIẾT Tôi đã viết tắt các cột và bí danh để đơn giản hóa việc đọc và hiểu khái niệm về những gì bạn có thể đang gặp phải.

Select
      t1.yr,
      sum( t2.Amt ) as AmtChange
   FROM 
      budget AS t1
         LEFT JOIN Budget_Changes AS t2
            on t1.yr = t2.Yr

Cuối cùng, không vấn đề gì ... trong một năm nhất định, bạn sẽ nhận được tổng số từ bảng thứ hai. Có nhiều bản ghi trong bảng 2. Ví dụ:Dữ liệu

Budget
Yr
2013
2014

Budget_Changes
Yr    Amt
2013  10
2013  20
2013  30
2014  40
2014  50

Your results would be
Yr    AmtChange
2013  60
2014  90

Chúng tôi có lẽ đồng ý về điều đó ở điểm này ... Bây giờ, hãy chuyển sang một bảng khác mà mỗi năm (hoặc bất cứ thứ gì), bảng đó cũng có nhiều bản ghi mỗi năm ...

Change_Orders
Yr     COAmt
2013   100
2013   120
2014   200
2014   220

Và bạn thêm điều này vào dưới dạng kết hợp phụ bên trái vào truy vấn của mình, chẳng hạn như

Select
      t1.yr,
      sum( t2.Amt ) as AmtChange,
      sum( t3.COAmt ) as COAmtChange
   FROM 
      budget AS t1
         LEFT JOIN Budget_Changes AS t2
            on t1.yr = t2.Yr
         LEFT JOIN Change_Orders AS t3
            on t1.yr = t3.Yr


Your might expect the results to be
Yr    AmtChange  COChangeAmt
2013  60         220
2014  90         420

Tuy nhiên, vì nó là kết quả Descartes ... nhiều hàng trên mỗi phép nối sẽ lấy kết quả LẦN mỗi mục nhập tồn tại trong bảng khác ... đại loại như

Yr    AmtChange  COChangeAmt
2013  120         440
2014  180         840

Để khắc phục điều này, mỗi bảng riêng lẻ mà bạn đang nhận tổng phụ phải được xử lý riêng và được nhóm theo năm của chính nó để tập hợp con chỉ trả về một hàng cho mỗi ngữ cảnh dữ liệu. Một cái gì đó giống như

Select
      t1.yr,
      t2.AmtChange,
      t3.COAmtChange
   FROM 
      budget AS t1
         LEFT JOIN ( select BC.Yr, sum( BC.Amt ) as AmtChange
                        from Budget_Changes BC
                        group by BC.Yr ) t2
            on t1.yr = t2.Yr
         LEFT JOIN ( select CO.Yr, sum( CO.COAmt ) as COAmtChange
                        from Change_Orders CO
                        group by CO.Yr ) AS t3
            on t1.yr = t3.Yr

Vì vậy, mỗi truy vấn phụ sẽ chỉ trả về 1 bản ghi cho năm tương ứng được tổng hợp và do đó ngăn chặn sự trùng lặp trong số tiền sum ().



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi các giá trị âm từ FROM_UNIXTIME

  2. Làm cách nào để chạy nhiều truy vấn chèn trong SQL bằng PHP trong một lần?

  3. Bất lợi khi sử dụng trường có kích thước văn bản dài MySQL là gì khi mọi mục nhập sẽ vừa với trường có kích thước văn bản trung bình?

  4. Quyền truy cập bị từ chối đối với Người dùng 'root' @ 'localhost' (sử dụng mật khẩu:CÓ)

  5. Cài đặt pdo_mysql trên Amazon EC2 với PHP 5.5