通过匹配SQL Server 2008中的多个表来提取数据

时间:2015-03-07 11:02:12

标签: sql-server sql-server-2008

我想根据多个表的匹配提取结果,三个表是特定的。表格为 Despatch Activation Replaced 。下图显示了它们中的结构和样本数据。

enter image description here

基于上图的预期结果是:

LotQty | ApprovedQty | DispatchDate | Installed
  15   |      10     |   2013-8-7   |    9

结果应符合以下标准:

LotQty,ApprovedQty DispatchDate 仅与Despatch

不同

已安装(真正的问题)。该字段基于计算:

  1. 查询应首先匹配来自 SerialNo Despatch 表格,以及 SerialNo Activation 表中的第20批。它找到8匹配,忽略具有不同批量的Product1& 2。

  2. 接下来对于8个匹配的SerialNo&#39>它应该比较日期。如果 DispatchDate SerialNo 小于 ActivationDate ,则计为1( Product3的 DispatchDate 大于 ActivationDate 。因此会被忽略。其余的SerialNo DispatchDate 是< ActivationDate )。因此, Activation 表中的总结果数为7。

  3. 对于 Despatch 表(Product1,2&amp; 3)中无法比拟的SerialNo,它应该在 Replaced <中执行匹配/ strong>表。它找到了所有Seri​​alNo的匹配,但由于Product4到Product10已经与 Activation 匹配,因此它应该只匹配3个剩余的SerialNo&#39;产品1,2&amp; ; 3)。产品1&amp;这里有2场比赛。接下来与上面类似,它应该检查 DispatchDate 是否&lt;的 RecordDate 即可。 Product1&amp; 2有 DispatchDate&lt; RecordDate 因此 Replaced 表中的计数为2。

  4. 现在总 Installed 应为9(来自 Activation 的表格为7, Replaced table)。
  5. SerialNo Desptach 中, Replaced 可以有多个 Activation 条目 Despatch 表,如上图所示。因此,首先应使用 Activation 表格来完成 SerialNo 表的SerialNo匹配,如果 {{ 1}} 是不匹配的,或者 DispatchDate&gt; ActivationDate 只有那些SerialNo才能继续在 Replaced 表中找到匹配项。

    到目前为止,在@ jpw的帮助下,我设法形成了如下查询:

    select
    (
        select distinct LOTQty
        from Despatch
        where LotQty = '15'
    )as LotQty
    
    ,(
        select COUNT(SerialNo)
        from Despatch
        where LotQty = '15'
    )as ApprovedQty
    
    ,(
        select distinct(DispatchDate)
        from Despatch
        where LotQty = '15'
    )as DispatchDate
    
    ,(
        select COUNT(A.SerialNo) + count(R.NewSerialNo)
        from Despatch D
        left join
            Activation A
            on D.SerialNo = A.SerialNo
            and D.DispatchDate <= A.ActivationDate
            and D.LotQty = A.LotQty
        left join
            Replaced R
            on D.SerialNo = R.NewSerialNo
            and D.DispatchDate <= R.RecordDate
    )as Installed
    

    产生错误的输出,即:

    LotQty | ApprovedQty | DispatchDate | Installed
      15   |      10     |   2013-8-7   |    17
    

    非常感谢帮助, 提前致谢

    EIDT1
    enter image description here

    所以从上图开始,即使是现在,Installed也应该是9,因为我只希望得到Lot15

1 个答案:

答案 0 :(得分:0)

问题在于您的替换数据。查看您的条件,它匹配该表中与Dispatch表中的序列号匹配的所有记录。你表明它应该只是2。您错过了一个条件,表明它在激活中无法匹配以缩小结果。

确保第二次加入中的A的SerialNo可以为您提供技巧

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

,(
    select COUNT(SerialNo)
    from Despatch
    where LotQty = '15'
)as ApprovedQty

,(
    select distinct(DispatchDate)
    from Despatch
    where LotQty = '15'
)as DispatchDate

,(
    select COUNT(A.SerialNo) + count(R.NewSerialNo)
    from Despatch D
    left join
        Activation A
        on D.SerialNo = A.SerialNo
        and D.DispatchDate <= A.ActivationDate
        and D.LotQty = A.LotQty
    left join
        Replaced R
        on D.SerialNo = R.NewSerialNo
        and D.DispatchDate <= R.RecordDate
        and A.SerialNo IS NULL
    where D.LotQty = '15'
)as Installed

我现在似乎无法登录到SQLFiddle,所以如果您想尝试一下,这里就是您需要的架构。

CREATE TABLE Despatch (
    SerialNo VARCHAR(20),
    DispatchDate DATETIME,
    LOTQty INT )

CREATE TABLE Activation (
    SerialNo VARCHAR(20),
    LOTQty INT,
    ActivationDate DATETIME )

CREATE TABLE Replaced (
    NewSerialNo VARCHAR(20),
    RecordDate DATETIME )

INSERT INTO Despatch
VALUES ('Product1', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product2', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product3', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product4', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product5', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product6', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product7', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product8', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product9', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product10', '2013-08-07', 15)
INSERT INTO Despatch
VALUES ('Product11', '2013-08-07', 20)
INSERT INTO Despatch
VALUES ('Product12', '2013-08-07', 20)

INSERT INTO Activation
VALUES ('Product1', 55, '2013-07-13')
INSERT INTO Activation
VALUES ('Product2', 20, '2013-11-13')
INSERT INTO Activation
VALUES ('Product3', 15, '2013-07-13')
INSERT INTO Activation
VALUES ('Product4', 15, '2013-11-13')
INSERT INTO Activation
VALUES ('Product5', 15, '2013-11-13')
INSERT INTO Activation
VALUES ('Product6', 15, '2013-11-13')
INSERT INTO Activation
VALUES ('Product7', 15, '2013-11-13')
INSERT INTO Activation
VALUES ('Product8', 15, '2013-11-13')
INSERT INTO Activation
VALUES ('Product9', 15, '2013-11-13')
INSERT INTO Activation
VALUES ('Product10', 15, '2013-11-13')

INSERT INTO Replaced
VALUES ('Product1', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product2', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product4', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product5', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product6', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product7', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product8', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product9', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product10', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product11', '2013-12-07')
INSERT INTO Replaced
VALUES ('Product12', '2013-12-07')