【发布时间】:2020-09-26 13:26:24
【问题描述】:
我的 ERP 中有三个表,我需要一个 SQL Server 查询来连接所有行。 这是我拥有的三个表及其属性,按产品代码 (SL.CodProduct = 'AL4301') 过滤以简化:
餐桌产品:
- 鳕鱼产品
- DescProduct
- 家庭
表股票:
- 鳕鱼产品
- 颜色
- 号码
- 库存单位
表卖:
- 鳕鱼产品
- 售出日期
- 颜色
- 号码
- 售出单位
我需要获取所有商品组合(颜色 - 编号)的列表,显示每月的销售额和当前的总库存。问题是某些商品组合没有销售。
我已经用这个查询试过了:
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
【问题讨论】:
-
我根据
NOLOCK的使用添加了SQL Server标签。没有理由使用NOLOCK——除非你真的、真的知道你在做什么。但它建议使用 SQL Server。 -
请use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。
-
请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。
-
感谢您的来信。其实是查询sql server,专门针对一个ERP,不好意思一开始没提。我使用了“NOLOCK”,因为在我从 ERP 中看到的所有查询中,他们总是使用这个参数。我不是 100% 确定我是否应该使用它。
标签: sql sql-server join cross-join