Как заполнить столбец без значения значением по умолчанию в наборе результатов (MySQL) - PullRequest
0 голосов
/ 12 октября 2011

У меня такой запрос:

SELECT table1.time, table1.co, table2.co_ro
FROM(
SELECT p1.time, SUM(p1.kpi_0) AS co
FROM hourly_history p1
WHERE p1.type_id=3
GROUP BY p1.time) AS table1,(
SELECT p2.time, SUM(p2.kpi_0) AS co_ro
FROM hourly_history p2
WHERE p2.type_id=5
GROUP BY p2.time) AS table2
WHERE table1.time=table2.time

Если данные существуют для type_id = 3 и не существуют для type_id = 5 для определенного значения времени (скажем, 12-10-2011 12:00:00), строка этого времени не существует в наборе результатов как ожидается.

Мне нужен запрос, который возвращает строку за указанное время, даже если для type_id = 5 не существует данных. Как мне написать такой запрос?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Эта концепция должна работать (хотя я не проверял эти запросы):

SELECT t1, sum(co), sum(co_ro)
FROM
(
  (
    SELECT p1.time AS t1, SUM(p1.kpi_0) AS co, 0 AS co_ro
    FROM hourly_history p1
    WHERE p1.type_id=3
    GROUP BY p1.time
  )

  UNION ALL

  (
    SELECT p2.time AS t1, 0 AS co, SUM(p2.kpi_0) AS co_ro
    FROM hourly_history p2
    WHERE p2.type_id=5
    GROUP BY p2.time
  )
)

GROUP BY t1;

Это должно быть еще проще:

SELECT t1, sum(co), sum(co_ro)
FROM
(
  (
    SELECT p1.time AS t1, p1.kpi_0 AS co, 0 AS co_ro
    FROM hourly_history p1
    WHERE p1.type_id=3
  )

  UNION ALL

  (
    SELECT p2.time AS t1, 0 AS co, p2.kpi_0 AS co_ro
    FROM hourly_history p2
    WHERE p2.type_id=5
  )
)

GROUP BY t1;
0 голосов
/ 12 октября 2011

Основной способ сделать это - создать таблицу со всеми временами, которые должны существовать, а затем оставить соединение с этим.Тогда ваши пропущенные значения становятся пустыми, и вы можете использовать COALESCE для заполнения значениями по умолчанию.

Таблица с временем не обязательно должна быть базовой таблицей.Он может быть построен путем объединения таблицы дней, часов и минут в виде представления или как часть запроса.

Хотя в вашем примере запроса вы могли бы получить то, чтоВы хотите просто переключиться с внутреннего соединения на левое соединение.К сожалению, MySQL не выполняет полное внешнее соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...