Sql server 在Sql Server 2008中匹配三个表中的数据

Sql server 在Sql Server 2008中匹配三个表中的数据,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我有三个表发送,激活和替换,如下所示: select ( select distinct LOTQty from Despatch where LOTQty = '20' )as LotQty ,( select COUNT(ProductNo) from Despatch where LOTQty = '20' )as ApprovedQty ,( select distinct(DispatchDate) from Desp

我有三个表
发送
激活
替换
,如下所示:

select
(
    select distinct LOTQty
    from Despatch
    where LOTQty = '20'
)as LotQty

,(
    select COUNT(ProductNo)
    from Despatch
    where LOTQty = '20'
)as ApprovedQty

,(
    select distinct(DispatchDate)
    from Despatch
    where LOTQty = '20'
)as DispatchDate

,(
    select COUNT(ProductNo)
    from Activation
    where ProductNo in (select ProductNo from Despatch) and LotQty = '20'
)as Installed

我想比较所有三个表中的数据,以
dispatch
表为基础

例如,如果我将LOTQty输入为20,我将收到基于以下计算的结果:

  • 它应将
    表中第20批下的所有
    激活表中的
    匹配。如果找到匹配项(在本例中为Product3、4、5和6),则下一步应检查日期

  • <> > > > < > > >发送日期< /代码> <强>匹配的产品不小于<强>代码>激活日期< /代码> <强>,仅此应考虑。(产品3的发送日期小于激活日期。因此,我们将其计数为1,类似于所有其他的发送日期)。因此,我们找到了4个匹配项

  • 产品1和产品2在激活表中未找到任何匹配项。对于此类产品编号,我们参考替换表。如果找到匹配项(在本例中为Product1),则应将发货日期与记录日期进行比较。如果<强>代码>调度日期< /代码> <强>小于<强>代码>记录日期< /代码> <强>,则我们只需考虑数据(产品1的发送日期小于记录日期。因此,我们将其计数为1)。p>
  • 因此,现在通过比较
    激活表,总量应为5,即4,通过比较
    替换表,总量应为1

  • 以上只是示例表条目。我的真实表格包含更多的列,这些列经过修剪以保持简单。我试着准备查询,但找不到符合我自己要求的逻辑。到目前为止,我尝试的查询如下:

    select
    (
        select distinct LOTQty
        from Despatch
        where LOTQty = '20'
    )as LotQty
    
    ,(
        select COUNT(ProductNo)
        from Despatch
        where LOTQty = '20'
    )as ApprovedQty
    
    ,(
        select distinct(DispatchDate)
        from Despatch
        where LOTQty = '20'
    )as DispatchDate
    
    ,(
        select COUNT(ProductNo)
        from Activation
        where ProductNo in (select ProductNo from Despatch) and LotQty = '20'
    )as Installed
    
    这将产生如下结果:

    安装字段显示为4 as。但根据我的上述要求,结果应该是5。如何构建查询以满足我的需求?
    非常感谢您的帮助,提前感谢

    EDIT1
    在比较
    发货
    表的
    产品编号
    激活
    替换
    时,在
    激活
    替换
    表中,可能存在相同
    的条目。因此,查询应首先检查
    激活
    表。如果它在那里找到与
    ProductNo
    匹配的,它将不会在
    替换的
    表中搜索相同的
    。只有那些在
    激活表中未找到匹配项的
    或其
    大于
    激活日期的
    产品才应与
    替换表匹配

    编辑2

    在上图中,批数量应为6,因为批20的发货表中只有6个产品编号

    对于安装的
    ,它是这样的:

  • 它首先将
    激活的
    表中的第20批次进行匹配。它找到5个匹配项(Product1、3、4、5、6)。但作为Product1的DispatchDate,它将计数作为4忽略Product1
    
  • 下一步,它尝试查找
    (Product1,2)到
    替换的
    的剩余
    的匹配项。由于
    被替换
    表没有
    LotQty
    列,因此它只与
    产品编号
    匹配。它为Product1找到了一个匹配项(虽然Product4在这里也匹配,但由于它已经从
    激活中考虑了
    ,因此不应该从
    替换中考虑它)。现在Product1的DispatchDate
    将其计为1
  • 现在,总共安装了4个来自激活的
    和1个来自被替换的
    使总数再次达到5

  • 我想你可以用左连接来做这个。尝试此查询,使用您的样本数据,它会生成所需的输出,除了
    ApprovedQuantity
    ,但我不知道您如何使用样本数据得出
    12

    select 
        d.LOTQty, 
        ApprovedQty = count(d.ProductNo),
        d.DispatchDate,
        Installed = count(a.ProductNo) + count(r.ProductNo)
    from 
        Despatch d 
    left join 
        Activation a 
         on d.ProductNo = a.ProductNo 
        and d.DispatchDate < a.ActivationDate 
        and d.LOTQty = a.LOTQty
    left join 
        Replaced r 
          on d.ProductNo = r.ProductNo 
         and d.DispatchDate < r.RecordDate
         -- only count Replaced when there is no match in Activation
         -- or DispatchDate is greater then ActivationDate
         and (a.ActivationDate is null or a.ActivationDate < d.DispatchDate)
    where 
        d.LOTQty = 20
    group by 
        d.LOTQty, d.DispatchDate
    

    我想你可以用左连接来做这个。尝试此查询,使用您的样本数据,它会生成所需的输出,除了
    ApprovedQuantity
    ,但我不知道您如何使用样本数据得出
    12

    select 
        d.LOTQty, 
        ApprovedQty = count(d.ProductNo),
        d.DispatchDate,
        Installed = count(a.ProductNo) + count(r.ProductNo)
    from 
        Despatch d 
    left join 
        Activation a 
         on d.ProductNo = a.ProductNo 
        and d.DispatchDate < a.ActivationDate 
        and d.LOTQty = a.LOTQty
    left join 
        Replaced r 
          on d.ProductNo = r.ProductNo 
         and d.DispatchDate < r.RecordDate
         -- only count Replaced when there is no match in Activation
         -- or DispatchDate is greater then ActivationDate
         and (a.ActivationDate is null or a.ActivationDate < d.DispatchDate)
    where 
        d.LOTQty = 20
    group by 
        d.LOTQty, d.DispatchDate
    

    我想你可以用左连接来做这个。尝试此查询,使用您的样本数据,它会生成所需的输出,除了
    ApprovedQuantity
    ,但我不知道您如何使用样本数据得出
    12

    select 
        d.LOTQty, 
        ApprovedQty = count(d.ProductNo),
        d.DispatchDate,
        Installed = count(a.ProductNo) + count(r.ProductNo)
    from 
        Despatch d 
    left join 
        Activation a 
         on d.ProductNo = a.ProductNo 
        and d.DispatchDate < a.ActivationDate 
        and d.LOTQty = a.LOTQty
    left join 
        Replaced r 
          on d.ProductNo = r.ProductNo 
         and d.DispatchDate < r.RecordDate
         -- only count Replaced when there is no match in Activation
         -- or DispatchDate is greater then ActivationDate
         and (a.ActivationDate is null or a.ActivationDate < d.DispatchDate)
    where 
        d.LOTQty = 20
    group by 
        d.LOTQty, d.DispatchDate
    

    我想你可以用左连接来做这个。尝试此查询,使用您的样本数据,它会生成所需的输出,除了
    ApprovedQuantity
    ,但我不知道您如何使用样本数据得出
    12

    select 
        d.LOTQty, 
        ApprovedQty = count(d.ProductNo),
        d.DispatchDate,
        Installed = count(a.ProductNo) + count(r.ProductNo)
    from 
        Despatch d 
    left join 
        Activation a 
         on d.ProductNo = a.ProductNo 
        and d.DispatchDate < a.ActivationDate 
        and d.LOTQty = a.LOTQty
    left join 
        Replaced r 
          on d.ProductNo = r.ProductNo 
         and d.DispatchDate < r.RecordDate
         -- only count Replaced when there is no match in Activation
         -- or DispatchDate is greater then ActivationDate
         and (a.ActivationDate is null or a.ActivationDate < d.DispatchDate)
    where 
        d.LOTQty = 20
    group by 
        d.LOTQty, d.DispatchDate
    

    @jpw我再次编辑了我的问题。在EDIT2中,我又添加了一个带有解释的图像,这增加了一点清晰度。希望这有助于更好地理解这个场景。。。Thanks@KC我不知道我是否理解,但如果你想要名单