查询不重合连接三张表

Query for join three tables without coincidences

我的 ERP 中有三个表,我需要通过 SQL 服务器进行查询以连接所有行。 这是我拥有的三个表格及其属性,按产品代码 (SL.CodProduct = 'AL4301') 过滤以简化:

TABLE 产品:

TABLE 股票:

TABLE 卖出:

我需要获取所有项目组合(颜色 - 数字)的列表,显示当前每月的销售额和总库存。问题是某些商品组合没有销售。

我已经用这个查询试过了:

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

使用 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;