SQL-запрос, левое соединение с NULL - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь создать список часов по Компании и Дате, даже если у Компании нет данных на эту Дату.Я попытался присоединиться к таблице календаря и группировке по ее датам, а затем по компании, но безрезультатно.

SELECT cal.date, comp.name, comp.hours
FROM company AS comp
LEFT JOIN calendar AS cal ON cal.date=comp.date
GROUP BY cal.date, comp.name

Я ожидаю получить выходные данные NULL, когда у компании нет часов на эту дату, напримертак:

2018-01-01   Company A   100
2018-01-01   Company B   NULL
2018-01-02   Company A   NULL
2018-01-02   Company B   NULL
2018-01-03   Company A   100
2018-01-03   Company B   50

Но он возвращает только те строки, в которых можно найти данные, как если бы я использовал INNER JOIN.Любая помощь будет оценена.Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вы сделали 3 ошибки, из которых 2 относятся к делу:

  1. Вы поменяли местами порядок таблиц в объединении (легко исправить)
  2. Ваш запрос не соответствуетотражает ваше заявленное намерение (труднее исправить)
  3. Вы используете GROUP BY, когда это не нужно (не имеет значения в данном конкретном случае)

Я сосредоточусь на 2. Вы 'близки к вашей цели, но не все там.Исправляя первую и третью ошибки, вот ваш запрос:

SELECT cal.date, comp.name, comp.hours
FROM calendar AS cal
LEFT JOIN company AS comp ON cal.date=comp.date

Это будет делать что-то вроде следующего:

For each cal_row in calendar:
    For each comp_row in company:
        If cal_row.date equals comp_row.date:
            Create output row and append to output
    If no rows created:
        Create output row, fill with NULLs, and append to output

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

SELECT tbl.date, tbl.name, comp.hours
FROM (
    SELECT DISTINCT cal.date, comp.name
    FROM calendar AS cal
    CROSS JOIN company as comp
) AS tbl
LEFT JOIN LEFT JOIN company AS comp ON
    tbl.date = comp.date AND tbl.name= comp.name

http://sqlfiddle.com/#!9/517b4e/11/0

Это соответствует желаемому результату.

0 голосов
/ 08 октября 2018

вы можете использовать календарь в качестве левой таблицы, в этом случае вы получите всю дату

SELECT cal.date, comp.name, comp.hours
FROM calendar  AS cal  
LEFT JOIN company AS comp ON cal.date=comp.date

Я не нашел ни одной статистической функции, поэтому я удалил группу на

...