sql >> Database >  >> RDS >> Mysql

MySql-query om alle combinaties van twee kolommen met NULL te krijgen als er geen overeenkomend record is

Je eerste outer join , zoals verwacht, produceert:

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

Echter, omdat outer joins resultaten opleveren als ten minste één keer aan de join-voorwaarde is voldaan (en introduceer alleen NULL registreert als de voorwaarde nooit is tevreden), je tweede outer join dan niet maak een record voor (B, July); het laat ook Reason = 'D' . vallen volledig, omdat niet aan de toetredingsvoorwaarde is voldaan (en elders aan alle drie de maanden is voldaan):

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

Terwijl je kon het verlies van Reason = 'D' . oplossen door toe te voegen OR a.Month IS NULL aan uw deelnamevoorwaarde, produceert u nog steeds geen (B, July) . In plaats daarvan, omdat u elk paar (Reason, Month) . wilt verkrijgen , je moet CROSS JOIN uw gematerialiseerde Reasons tabel met uw gerealiseerde Months tafel:

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 |

Bekijk het op sqlfiddle .

U hoeft dan alleen het resultaat met uw onderliggende gegevens te verbinden:

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) |

Bekijk het op sqlfiddle .




  1. Android studio getSlotFromBufferLocked:onbekende bufferfout

  2. JDBC PreparedStatement resulteert in MySQL-syntaxisfout

  3. PHP om afbeeldingen op te slaan in MySQL of niet?

  4. MySQL OP DUPLICATE KEY invoegen in een audit- of logtabel