Mysql
 sql >> база данни >  >> RDS >> Mysql

MySql заявка за получаване на всички комбинации от две колони с NULL, ако няма съответстващ запис

Вашето първо външно присъединяване , както се очаква, произвежда:

<преди>| ПРИЧИНА | МЕСЕЦ |-------------------| A | май || A | май || A | юли || A | юни || B | май || B | юни || D | (null) |

Въпреки това, тъй като външните съединения дават резултати, ако условието за свързване е изпълнено поне веднъж (и въведе само NULL записва, ако условието е никога доволен), вашето второ външно присъединяване тогава не създайте запис за (B, July); също изпуска Reason = 'D' изцяло, защото условието за присъединяване не е изпълнено (и всичките три месеца са изпълнени другаде):

<преди>| ПРИЧИНА | МЕСЕЦ |------------------| A | май || A | май || B | май || A | юни || B | юни || A | юли |

Докато можехте разреши загубата на Reason = 'D' чрез добавяне OR a.Month IS NULL към вашето условие за присъединяване, вие все още няма да произвеждате (B, July) . Вместо това, защото искате да получите всяка двойка (Reason, Month) , трябва да CROSS JOIN вашите материализирани Reasons таблица с вашите материализирани Months таблица:

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
 
<преди>| ПРИЧИНА | МЕСЕЦ |------------------| A | май || B | май || D | май || A | юни || B | юни || D | юни || A | юли || B | юли || D | юли |

Вижте го на sqlfiddle .

След това просто се нуждаете от външно свързване на резултата с основните ви данни:

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
 
<преди>| ПРИЧИНА | МЕСЕЦ | ПРЕСТОЙ |-----------------------------| A | юли | 3 || A | юни | 8 || A | май | 7 || B | юли | (нула) || B | юни | 6 || B | май | 5 || D | юли | (нула) || D | юни | (нула) || D | май | (null) |

Вижте го на 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. mysql innodb:таблица за описание не показва препратки към колони, какво ги показва?

  2. Php :Конвертирайте blob във файл с изображение

  3. Импортиране на стара папка с данни на mysql

  4. Как да кача изображение на localhost сървър, докато пътят се съхранява в базата данни на mysql?

  5. Проверете дали текущата дата е между две дати + заявка за избор на mysql