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、ApprovedQty和Dispatch Date仅为计数,与Dispatch
表不同
已安装(实际问题)。此字段基于以下计算:
表中的发货
表中的序列号与激活
表中批次20下的序列号进行匹配。它找到8个匹配项,忽略具有不同批次数量的产品1和2
序列号的
小于
,则将其计为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')