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),则下一步应检查日期
激活表,总量应为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我不知道我是否理解,但如果你想要名单