我有三个表Despatch
,Activation
和Replaced
,如下所示:
我想比较所有三个表中的数据,其中 Despatch
表是基数。
例如,如果我输入LOTQty为20,我应该根据以下计算得到结果:
它应该与 ProductNo
表格中的所有 Despatch
匹配 ProductNo
< / strong>在 Activation
表中。如果找到匹配(在本例中为Product3,4,5&amp; 6),则接下来应检查日期。
如果匹配的ProductNo Dispatch Date
小于 Activation Date
,则应考虑。(Product3&# 39; s发货日期小于激活日期。因此我们将其计为1,对所有其他日期也相同)。因此我们找到了4场比赛。
Product1和Product2在激活表中未找到任何匹配项。对于此类产品编号,请参阅替换表。如果找到匹配项(在本例中为Product1),则应将 Dispatch Date
与 Record Date
进行比较。如果 Dispatch Date
小于 Record Date
,那么我们应该考虑数据(Product1&#39; s Dispatch date小于RecordDate。所以我们算作1)。
所以现在通过比较 Activation
表和1与 Replaced
表进行比较,总数量应为5,即4。 / p>
以上只是示例表条目。我的真实表包含更多列,这些列经过修剪以保持简单。我尝试准备查询,但我无法找到满足自己要求的逻辑。我到目前为止尝试的查询如下:
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。但根据我的上述要求,结果应该是5.如何构建我的查询以满足我的要求? 非常感谢帮助,提前致谢。
EDIT1
将 Despatch
表 ProductNo
与 Activation
和 {{进行比较时1}} , Replaced
和 {可能存在相同 ProductNo
的条目{1}} 表。因此,查询应首先使用 Activation
表进行检查。如果找到 Replaced
匹配,则不应在 Activation
ProductNo
>表。只有那些 ProductNo
在 Replaced
表格中找不到匹配或 ProductNo
大于< strong> Activation
日期应与 DispatchDate
表匹配。
编辑2
在上图中, Activation
应为6,因为20号地段的 Replaced
表中只有6个ProductNo。
ApprovedQty
就是这样:
Despatch
的 Installed
ProductNo
{{第20批的1}} 表。它找到5个匹配(Product1,3,4,5,6)。但是作为产品1的 Despatch
&gt; ProductNo
,将计数视为4忽略Product1。 Activation
从 DispatchDate
(Product1,2)中找到剩余 ActivationDate
的匹配项 ProductNo
。由于 Despatch
表没有 Replaced
列,因此它与 ProductNo
匹配。它找到了Product1的匹配项(尽管Product4也在这里匹配,但因为它已经从 Replaced
考虑过了,所以不应该从 {{1}中考虑它} )。现在Product1&#39; LotQty
&lt; ProductNo
因此将其视为1. Activation
为4, Replaced
为1,使总数再次为5。答案 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