Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server 2008中通过匹配多个表提取数据_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 在SQL Server 2008中通过匹配多个表提取数据

Sql server 在SQL Server 2008中通过匹配多个表提取数据,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我想从多个表中提取基于匹配的结果,具体来说是三个表。这些表分别是发送,激活和替换。下图显示了其中的结构和示例数据 基于上图的预期结果为: LotQty | ApprovedQty | DispatchDate | Installed 15 | 10 | 2013-8-7 | 9 结果应符合以下标准: LotQty、ApprovedQty和Dispatch Date仅为计数,与Dispatch表不同 已安装(实际问题)。此字段基于以下计算: 查询应首先将

我想从多个表中提取基于匹配的结果,具体来说是三个表。这些表分别是
发送
激活
替换
。下图显示了其中的结构和示例数据

基于上图的预期结果为:

LotQty | ApprovedQty | DispatchDate | Installed
  15   |      10     |   2013-8-7   |    9
结果应符合以下标准:

LotQty、ApprovedQtyDispatch Date仅为计数,与
Dispatch
表不同

已安装(实际问题)。此字段基于以下计算:

  • 查询应首先将
    表中的
    发货
    表中的
    序列号与
    激活
    表中批次20下的
    序列号进行匹配。它找到8个匹配项,忽略具有不同批次数量的产品1和2

  • 接下来是8个匹配的序列号,它应该比较日期。如果
    序列号的
    小于
    ,则将其计为1。(产品3的
    调度日期
    大于
    激活日期
    。因此它被忽略。对于序列号的其余部分
    调度日期
    激活日期
    ).因此,
    激活
    表中的总结果计数为7

  • 对于来自
    发货
    表(产品1、2和3)的不匹配序列号它应该在被替换的表中执行匹配。它找到所有序列号的匹配项,但由于产品4和产品10已经从激活中匹配,因此它应该只匹配3个剩余序列号(产品1、2和3).Product1和2在此匹配。下一步与上面类似,它应该检查
    调度日期
    是否为
    记录日期
    。Product1和2都有
    调度日期
    记录日期
    ,因此从
    替换的
    表中的计数为2

  • 现在,安装的
    总数应为9(激活
    表中的7个,替换
    表中的2个)
  • 如上图所示,
    替换的
    激活的
    表中都可以有来自
    序列号的多个条目。因此,首先应使用
    表进行序列号的匹配h
    激活
    表,如果
    序列号
    中的任何一个不匹配或它是
    调度日期
    激活日期
    ,则对于那些序列号,应该在
    替换的
    表中查找匹配项

    到目前为止,在我的帮助下,我成功地形成了如下查询:

    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
    
    非常感谢您的帮助, 提前谢谢

    EIDT1


    因此,从上图来看,即使现在安装的
    也应该是9,因为我只希望Lot15的结果是问题在于替换的数据。查看您的情况,它与该表中与分派表中的序列号匹配的所有记录相匹配。但您指出它应该只有2。您丢失了一种表明其在激活方面不匹配以缩小结果范围的情况

    确保A在第二次联接中的序列号应该可以为您提供帮助

    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
    

    @Brian Dishaw感谢你在这里帮忙。我用你的更新更改了我的查询,但它仍然给出10的答案,而不是期望的9。而且我没有得到最后一个“左连接”部分。它正在检查A.SerialNo是否为空。我有几个Dispatch表的序列号在激活时未找到匹配项。这些序列号应该只与替换的talbe匹配。我不确定这是否是您的查询所做的,它缩小了结果范围…请查看您是否可以帮助我获得所需的输出…也用于安装ed列它正在检查发货表和激活表中所有相等的LotQty(D.LotQty=A.LotQty在第一个左联接中)。因此,即使我给出的批次为20,它仍将匹配在Dispatch and Activation Table中匹配的所有批次。当我在sqlfiddle.com上使用与您的示例匹配的架构和插入时,我重新安装了9。您查看的数据是否与您的示例不同?第二次连接中的A.SerialNo为null将只提供与t匹配的数据在第一次连接中不匹配的软管。如果您忽略了这一点,那么您将始终在发送和激活表中匹配。我似乎仍然无法登录到sqlfiddle进行共享,但下面是我看到的结果的屏幕截图。
    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
    
    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')