Sql 无重合联接三个表的查询

Sql 无重合联接三个表的查询,sql,sql-server,join,cross-join,Sql,Sql Server,Join,Cross Join,我的ERP中有三个表,我需要一个SQL Server查询来连接所有行。 以下是我的三个表及其属性,按产品代码SL.CODDRODUCT='AL4301'进行筛选以简化: 表产品: 副产物 描述产品 家庭 表1:库存: 副产物 颜色 数字 单位股票 表格销售: 副产物 已售出 颜色 数字 UnitsSold 我需要得到一个所有的项目组合颜色编号列表,显示每月销售和总库存目前。问题是,对于某些商品组合,没有销售 我已尝试使用此查询: SELECT DatePart(mm, SELLS.DateSol

我的ERP中有三个表,我需要一个SQL Server查询来连接所有行。 以下是我的三个表及其属性,按产品代码SL.CODDRODUCT='AL4301'进行筛选以简化:

表产品:

副产物 描述产品 家庭 表1:库存:

副产物 颜色 数字 单位股票 表格销售:

副产物 已售出 颜色 数字 UnitsSold 我需要得到一个所有的项目组合颜色编号列表,显示每月销售和总库存目前。问题是,对于某些商品组合,没有销售

我已尝试使用此查询:

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
使用交叉联接生成股票和月份的所有组合。然后使用左连接和聚合:

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;

我在使用NOLOCK的基础上添加了sqlserver标记。没有理由使用NOLOCK,除非你真的知道自己在做什么。但它建议使用SQL Server。仅将图像用于不能表示为文本或扩充文本的内容。包括图例/图例和说明以及图像。请在代码问题中给出一个-剪切粘贴和可运行代码,包括作为代码输入的最小代表性示例;期望和实际输出,包括逐字记录错误消息;标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。调试基础。对于包含DBMS和DDL(包括约束和索引)的SQL,请输入格式化为表的代码。暂停总体目标的工作,在第一个表达中删去代码,不要给出你的期望,说出你的期望和原因。谢谢你的留言。事实上,这是一个针对sql server的查询,特别是针对ERP的查询,很抱歉在开始时没有提到它。我使用NOLOCK是因为在我从ERP看到的所有查询中,它们总是使用这个参数。我不是100%确定我是否应该使用它。