sql >> Databasteknik >  >> RDS >> Mysql

MySql-fråga för att få alla kombinationer av två kolumner med NULL om det inte finns någon matchande post

Din första yttre koppling , som förväntat, producerar:

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

Men eftersom yttre kopplingar ger resultat om kopplingsvillkoret är uppfyllt minst en gång (och introducera bara NULL registrerar om villkoret är aldrig nöjd), din andra yttre koppling sedan inte skapa en post för (B, July); den tappar också Reason = 'D' helt och hållet eftersom anslutningsvillkoret inte är uppfyllt (och alla tre månader har uppfyllts någon annanstans):

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

Medan du kunde lösa förlusten av Reason = 'D' genom att lägga till OR a.Month IS NULL till ditt anslutningsvillkor kommer du fortfarande inte att producera (B, July) . Istället för att du vill få varje par av (Reason, Month) , du måste CROSS JOIN dina materialiserade Reasons tabell med din materialiserade Months tabell:

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 |

Se den på sqlfiddle .

Du behöver då bara sammanfoga resultatet med dina underliggande data:

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

Se den på sqlfiddle .




  1. NÄR SQLERROR aldrig fungerar

  2. Förstå kontrollbegränsningar i PostgreSQL

  3. Dynamisk UNION ALL-fråga i Postgres

  4. AndroidApp och MySqlConnection fungerade inte connection.open