Недостающие данные при объединении таблиц

#sql #sql-server #tsql #sql-server-2012

#sql #sql-сервер #tsql #sql-server-2012

Вопрос:

Мне не хватает данных при выборе некоторых переменных «season». Я полагаю, что проблема заключается в предложении where . Я использую:

 "where season = @season Or season IS NULL"
 

Это позволяет мне получать все данные из таблицы a и сопоставлять данные из таблицы b для определенного сезона. Это отлично работает для некоторых сезонов и не для других. Для сезона 2018 года я получаю все строки из таблицы a, чего я и хочу. Но если я использую сезон 2019 года, он пропускает любые записи, которые не имеют нулевых значений

Моя команда выбора, которую я использую,:

 SELECT    a.customerid,
          a.lname,
          a.fname,
          b.customerid,
          b.mtg1,
          b.mtg2,
          b.mtg3,
          b.mtg4,
          (COALESCE(Sum(b.mtg1), 0)   COALESCE(Sum(b.mtg2), 0)   COALESCE(Sum(b.mtg3), 0)   COALESCE(Sum(b.mtg4), 0)) AS total
FROM      customer a
LEFT JOIN hours b
ON        a.customerid = b.customerid
WHERE     b.season = @Season
OR        b.season IS NULL
GROUP BY  a.customerid,
          a.lname,
          a.fname,
          b.customerid,
          b.mtg1,
          b.mtg2,
          b.mtg3,
          b.mtg4,
ORDER BY  a.lname 
 

Например, это данные, которые у меня есть:

введите описание изображения здесь

введите описание изображения здесь

Это данные, которые я получаю за 2019 год

введите описание изображения здесь

Но это данные, которые я хочу получить на 2019 год

введите описание изображения здесь

Ответ №1:

Попробуйте переместить WHERE предложение в ON предложение (и вы можете опустить эту OR часть).:

 ...
LEFT JOIN hours b
ON        a.customerid = b.customerid
AND       b.season = @Season
...