Полное внешнее объединение Не включая все записи с обеих сторон - PullRequest
0 голосов
/ 21 октября 2019

У меня есть таблица календаря с датами с 2000 по 2029 год. Я выполнил полное внешнее объединение с моей таблицей данных на дату = tdate. Моя цель - подсчитать количество поездок по дате и показать ноль, если поездок нет. Тем не менее, все даты не отображаются. Если в таблице данных нет даты поездки, дата из таблицы Календаря вообще не отображается. Я никогда не видел, чтобы это случилось раньше. Я попытался изменить его на левое внешнее соединение, которое тоже не сработало. Актуальный запрос ниже.

    SELECT DISTINCT c.DATE,
        COALESCE(COUNT(t.TripID), 0) AS tripCount
    FROM dbo.Calendar c
    FULL OUTER JOIN dbo.TripsMade t ON c.DATE = CONVERT(DATE, t.tripdate, 126)
    WHERE (c.DATE BETWEEN '2019-09-01' AND '2019-09-30' )
      AND (t.compid = 270 OR t.compid IS NULL)
    GROUP BY c.DATE
    ORDER BY c.DATE

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

Что мне здесь не хватает?

ЦельДАТА TOTAL_TRIPS2019-09-01 32019-09-02 52019-09-03 0 <== Эта строка в настоящее время полностью отсутствует2019-09-04 42019-09-05 0 <== Эта строка в настоящее время полностью отсутствует2019-09-06 9</p>

1 Ответ

0 голосов
/ 21 октября 2019

Ваше предложение WHERE заканчивает фильтрацией несоответствий из обеих таблиц, превращая их почти в INNER JOIN s (это немного сложно с условием на t.

Я неЯ не думаю, что вам нужно FULL JOIN. Я подозреваю, что вы хотите LEFT JOIN с фильтрацией (для второй таблицы) в предложении ON:

SELECT c.Date, COUNT(t.TripID) AS tripCount
FROM dbo.Calendar c LEFT OUTER JOIN
     dbo.TripsMade t
     ON c.date = CONVERT(DATE, t.tripdate, 126) AND
        t.compid = 270
WHERE c.Date BETWEEN '2019-09-01' AND '2019-09-30'
GROUP BY c.Date
ORDER BY c.Date;

Если compid действительно может принять NULL значений, и вы хотите их, затем используйте (t.compid = 270 OR t.compid IS NULL). Я подозреваю, что это не то, что вы хотите. NULL просто представляет несоответствие на JOIN.

Примечания:

  • SELECT DISTINCT почти никогда не используется с GROUP BY, и в этом случае оно не требуется.
  • COUNT() не возвращает NULL, поэтому нет необходимости в COALESCE().
  • Фильтрация по таблице first относится к предложению WHERE.
...