问题描述
我的ERP中有三个表,并且需要SQL Server查询以联接所有行。 这是我拥有的三个表及其属性,这些表通过产品代码(SL.CodProduct ='AL4301')进行过滤以简化操作:
餐桌产品:
- CodProduct
- DescProduct
- 家庭
桌子上的东西
- CodProduct
- 颜色
- 号码
- UnitsStock
表出售:
- CodProduct
- DateSold
- 颜色
- 号码
- 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.DescProduct,SELLS.Number
ORDER BY SELLS.CodProduct,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,SL.DATESOLD),SL.NUMBER) SLL
ON SLL.CODPRODUCT = ST.CODPRODUCT
AND SLL.COLOR = ST.COLOR
AND SLL.NUMBER = ST.NUMBER
ORDER BY ST.CODPRODUCT,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.unitsstock;