Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Permintaan MySql untuk mendapatkan semua kombinasi dua kolom dengan NULL jika tidak ada catatan yang cocok

Gabungan luar pertama Anda , seperti yang diharapkan, menghasilkan:

| REASON |  MONTH |
-------------------
|      A |    May |
|      A |    May |
|      A |   July |
|      A |   June |
|      B |    May |
|      B |   June |
|      D | (null) |

Namun, karena outer join menghasilkan hasil jika kondisi join terpenuhi setidaknya sekali (dan hanya memperkenalkan NULL mencatat jika kondisinya tidak pernah puas), gabungan luar kedua Anda maka tidak menghasilkan catatan untuk (B, July); itu juga menjatuhkan Reason = 'D' seluruhnya, karena kondisi bergabung tidak terpenuhi (dan ketiga bulan telah dipenuhi di tempat lain):

| REASON | MONTH |
------------------
|      A |   May |
|      A |   May |
|      B |   May |
|      A |  June |
|      B |  June |
|      A |  July |

Sementara Anda bisa mengatasi hilangnya Reason = 'D' dengan menambahkan OR a.Month IS NULL dengan syarat bergabung, Anda tetap tidak akan menghasilkan (B, July) . Sebaliknya, karena Anda ingin mendapatkan setiap pasangan (Reason, Month) , Anda harus CROSS JOIN Reasons Anda yang terwujud tabel dengan Months yang Anda wujudkan tabel:

SELECT Reason, Month
FROM   
  (
    SELECT 'A' AS Reason
    UNION ALL SELECT 'B'
    UNION ALL SELECT 'D'
  ) Reasons CROSS JOIN (
    SELECT 'May' AS Month
    UNION ALL SELECT 'June'
    UNION ALL SELECT 'July'
  ) Months
| REASON | MONTH |
------------------
|      A |   May |
|      B |   May |
|      D |   May |
|      A |  June |
|      B |  June |
|      D |  June |
|      A |  July |
|      B |  July |
|      D |  July |

Lihat di sqlfiddle .

Anda kemudian hanya perlu menggabungkan hasil luar dengan data dasar Anda:

SELECT Reason, Month, SUM(Down_time) downtime
FROM   
  (
    SELECT 'A' AS Reason
    UNION ALL SELECT 'B'
    UNION ALL SELECT 'D'
  ) Reasons CROSS JOIN (
    SELECT 'May' AS Month
    UNION ALL SELECT 'June'
    UNION ALL SELECT 'July'
  ) Months
  LEFT JOIN tabledown USING (Reason, Month)
GROUP BY Reason, Month
| REASON | MONTH | DOWNTIME |
-----------------------------
|      A |  July |        3 |
|      A |  June |        8 |
|      A |   May |        7 |
|      B |  July |   (null) |
|      B |  June |        6 |
|      B |   May |        5 |
|      D |  July |   (null) |
|      D |  June |   (null) |
|      D |   May |   (null) |

Lihat di sqlfiddle .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan PDO:Nomor parameter tidak valid:parameter tidak ditentukan

  2. Bagaimana menemukan apakah nama kolom adalah kata kunci yang dicadangkan di berbagai basis data

  3. PHP loop bertindak sebagai cronjob [pastikan hanya satu instance yang berjalan]

  4. MySQL str_to_date menghasilkan NULL meskipun pemformatan valid

  5. Apa perbedaan antara SERIAL dan AUTO_INCREMENT di mysql