【问题标题】:Query for join three tables without coincidences查询无重合三表连接
【发布时间】: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


【解决方案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;

【讨论】:

    猜你喜欢
    • 2012-05-02
    • 2015-09-23
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    相关资源
    最近更新 更多