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

时间:2015-03-04 11:32:52

标签: sql-server sql-server-2008

我有三个表DespatchActivationReplaced,如下所示:

enter image description here

我想比较所有三个表中的数据,其中 Despatch 表是基数。

例如,如果我输入LOTQty为20,我应该根据以下计算得到结果:

  1. 它应该与 ProductNo 表格中的所有 Despatch 匹配 ProductNo < / strong>在 Activation 表中。如果找到匹配(在本例中为Product3,4,5&amp; 6),则接下来应检查日期。

  2. 如果匹配的ProductNo Dispatch Date 小于 Activation Date ,则应考虑。(Product3&# 39; s发货日期小于激活日期。因此我们将其计为1,对所有其他日期也相同)。因此我们找到了4场比赛。

  3. Product1和Product2在激活表中未找到任何匹配项。对于此类产品编号,请参阅替换表。如果找到匹配项(在本例中为Product1),则应将 Dispatch Date Record Date 进行比较。如果 Dispatch Date 小于 Record Date ,那么我们应该考虑数据(Product1&#39; s Dispatch date小于RecordDate。所以我们算作1)。

  4. 所以现在通过比较 Activation 表和1与 Replaced 表进行比较,总数量应为5,即4。 / p>

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

    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
    

    结果如下:
    enter image description here

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

    EDIT1
    Despatch ProductNo Activation {{进行比较时1}} Replaced {可能存在相同 ProductNo 的条目{1}} 表。因此,查询应首先使用 Activation 表进行检查。如果找到 Replaced 匹配,则不应在 Activation ProductNo >表。只有那些 ProductNo Replaced 表格中找不到匹配或 ProductNo 大于< strong> Activation
    日期应与 DispatchDate 表匹配。

    编辑2 enter image description here

    在上图中, Activation 应为6,因为20号地段的 Replaced 表中只有6个ProductNo。

    ApprovedQty 就是这样:

    1. 首先匹配来自 Despatch Installed ProductNo {{第20批的1}} 表。它找到5个匹配(Product1,3,4,5,6)。但是作为产品1的 Despatch &gt; ProductNo ,将计数视为4忽略Product1。
    2. 接下来,它尝试使用 Activation DispatchDate (Product1,2)中找到剩余 ActivationDate 的匹配项 ProductNo 。由于 Despatch 表没有 Replaced 列,因此它与 ProductNo 匹配。它找到了Product1的匹配项(尽管Product4也在这里匹配,但因为它已经从 Replaced 考虑过了,所以不应该从 {{1}中考虑它} )。现在Product1&#39; LotQty &lt; ProductNo 因此将其视为1.
    3. 现在,已安装的总数为 Activation 为4, Replaced 为1,使总数再次为5。

1 个答案:

答案 0 :(得分:3)

我认为您可以使用左连接来执行此操作。尝试此查询,使用您的示例数据生成所需的输出,但ApprovedQty除外,但我不知道您是如何使用示例数据到达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

这会输出:

LOTQty  ApprovedQty DispatchDate    Installed
20      6           2013-08-07      5