Mysql
 sql >> Database >  >> RDS >> Mysql

Query MySql per ottenere tutte le combinazioni di due colonne con NULL se non ci sono record corrispondenti

Il tuo primo outer join , come previsto, produce:

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

Tuttavia, poiché i join esterni producono risultati se la condizione di join è soddisfatta almeno una volta (e introduci solo NULL record se la condizione è mai soddisfatto), il tuo secondo outer join allora non produrre un record per (B, July); rilascia anche Reason = 'D' interamente, perché la condizione di adesione non è soddisfatta (e tutti e tre i mesi sono stati soddisfatti altrove):

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

Mentre tu potresti risolvere la perdita di Reason = 'D' aggiungendo OR a.Month IS NULL alla tua condizione di adesione, non produrrai ancora (B, July) . Invece, perché vuoi ottenere ogni coppia di (Reason, Month) , devi CROSS JOIN le tue Reasons materializzate tabella con i tuoi Months materializzati tabella:

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 |

Guardalo su sqlfiddle .

Quindi devi semplicemente unire il risultato con i tuoi dati sottostanti:

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

Guardalo su sqlfiddle .