Запрос на объединение трех таблиц без совпадений

У меня есть три таблицы в моей ERP, и мне нужен запрос SQL Server для объединения всех строк. Вот три таблицы, которые у меня есть со своими свойствами, фильтрация по коду продукта (SL.CodProduct = 'AL4301') для упрощения:

СТОЛОВЫЕ ПРОДУКТЫ:

Настольные продукты

  • ТрескаПродукт
  • ОписаниеПродукт
  • Семья

СТОЛОВЫЕ ЗАПАСЫ:

Стандартные акции

  • ТрескаПродукт
  • Цвет
  • Число
  • ЕдиницыЗапас

ТАБЛИЦА ПРОДАЕТ:

Таблица продает

  • ТрескаПродукт
  • ДатаПродано
  • Цвет
  • Число
  • Проданных единиц

Мне нужно получить список всех комбинаций элементов (цвет - номер), показывающий продажи в месяц и общий запас в настоящее время. Проблема в том, что для некоторых комбинаций товаров не было продаж.

Я пробовал это с этим запросом:

SELECT DatePart(mm, SELLS.DateSold) As Month,
       SELLS.CodProduct, PRODUCTS.DescProduct,
       SELLS.Color, SELLS.Number,
       SUM(SELLS.UnitsSold,
       (SELECT STOCKS.UnitsStock
        FROM STOCKS WITH(NOLOCK)
        WHERE STOCKS.CodProduct = SELLS.CodProduct
        AND STOCKS.Color = SELLS.Color AND STOCKS.Number = SELLS.Number) As Stock
FROM SELLS WITH(NOLOCK)
JOIN PRODUCTS WITH (NOLOCK) ON PRODUCTS.CodProduct = SELLS.CodProduct
WHERE PRODUCTS.Family = 05 AND SELLS.CodProducto = 'AL4301'
GROUP BY DatePart(mm, SELLS.DateSold), SELLS.CodProduct, SELLS.DescProduct, SELLS.Color, SELLS.Number
ORDER BY SELLS.CodProduct, SELLS.Color, SELLS.Number

С помощью этого запроса я получаю следующее:

Результат запроса

Но мне нужно было бы получить это:

Цель запроса

Благодаря @Gordon Linoff я получил решение. Наконец, я использовал это:

SELECT ST.CODPRODUCT, ST.DESPRODUCT, ST.COLOR, ST.NUMBER,
       P.FAMILY, ST.UNITSSTOCK STOCK, SLL.MONTH, SLL.UNITSSOLD       
FROM STOCKS ST
JOIN PRODUCTS P ON P.CODPRODUCT = ST.CODPRODUCT
LEFT OUTER JOIN
        (SELECT SL.CODPRODUCT, SL.COLOR, SL.NUMBER,
                DatePart(mm, SL.DATESOLD) MONTH,
                SUM(SL.UNITSSOLD) UNITSSOLD
         FROM SELLS SL
         GROUP BY SL.CODPRODUCT, DatePart(mm, SL.DATESOLD),
                  SL.COLOR, SL.NUMBER) SLL
ON SLL.CODPRODUCT = ST.CODPRODUCT
   AND SLL.COLOR = ST.COLOR
   AND SLL.NUMBER = ST.NUMBER
ORDER BY ST.CODPRODUCT, ST.COLOR, ST.NUMBER

person antoine    schedule 26.09.2020    source источник
comment
Я добавил тег SQL Server на основе использования NOLOCK. Нет причин использовать NOLOCK, если только вы действительно не знаете, что делаете. Но он предлагает SQL Server.   -  person Gordon Linoff    schedule 26.09.2020
comment
Пожалуйста, используйте текст, а не изображения/ссылки, для текста, включая таблицы и ERD. Используйте изображения только для того, что не может быть выражено в виде текста или для дополнения текста. Включите легенду / ключ и объяснение с изображением.   -  person philipxy    schedule 27.09.2020
comment
Пожалуйста, в вопросах по коду дайте минимальный воспроизводимый пример -- вырезайте, вставляйте и запускайте код, включая наименьший репрезентативный ввод примера как код; желаемый и фактический вывод (включая дословные сообщения об ошибках); теги и версии; четкая спецификация и объяснение. Дайте наименьший код, который вы можете показать, это код, который, как вы показываете, в порядке, расширенный кодом, который, как вы показываете, не в порядке. (Основы отладки.) Для SQL, который включает СУБД и DDL (включая ограничения и индексы) и ввод в виде кода, отформатированного в виде таблицы. Как спросить Приостановить работу над общей целью, сократить код до 1-го выражения, не дающего того, что вы ожидаете, и сказать, что вы ожидаете и почему.   -  person philipxy    schedule 27.09.2020
comment
Спасибо за заметку. На самом деле это запрос для SQL-сервера, особенно для ERP, извините, что не упомянул об этом в начале. Я использовал NOLOCK, потому что во всех запросах, которые я видел из ERP, они всегда используют этот параметр. Я не был на 100% уверен, стоит ли мне его использовать.   -  person antoine    schedule 27.09.2020
comment
Пожалуйста, уточните через правки, а не комментарии. См. раздел Как работают комментарии @ответов?, чтобы научиться использовать @x для уведомления. один не единственный комментатор, не публикующий постов, x повторный комментарий. Пожалуйста, не выбрасывайте неправильный код. Помимо отсутствия исследований, это ставит вопрос, который никому не нужен. Пожалуйста, отреагируйте на мои предыдущие комментарии.   -  person philipxy    schedule 27.09.2020
comment
@philipxy Я отредактировал свой вопрос, указав, что я работал с SQL Server, заголовком для таблиц и написал код с выполненным запросом, его результатами и тем, что я хотел получить.   -  person antoine    schedule 27.09.2020


Ответы (1)


Используйте cross join для создания всех комбинаций акций и месяцев. Затем используйте left join и агрегацию:

select s.codproduct, s.color, s.number, year(v.month), month(v.month),
       s.unitsstock, sum(sa.unitssold)
from stocks s cross join
     (values ('2020-09-01')) v(month) left join
     sales sa
     on s.codproduct = sa.codproduct and
        s.color = sa.color and
        s.number = sa.number and
        sa.datesold >= v.month and
        sa.datesold < dateadd(month, 1, v.month)
group by s.codproduct, s.color, s.number, year(v.month), month(v.month),
         s.unitsstock;
person Gordon Linoff    schedule 26.09.2020