我想根据多个表的匹配提取结果,三个表是特定的。表格为 Despatch
, Activation
和 Replaced
。下图显示了它们中的结构和样本数据。
基于上图的预期结果是:
LotQty | ApprovedQty | DispatchDate | Installed
15 | 10 | 2013-8-7 | 9
结果应符合以下标准:
LotQty,ApprovedQty 和 DispatchDate 仅与Despatch
表
已安装(真正的问题)。该字段基于计算:
查询应首先匹配来自 SerialNo
的 Despatch
表格,以及 SerialNo
在 Activation
表中的第20批。它找到8匹配,忽略具有不同批量的Product1& 2。
接下来对于8个匹配的SerialNo&#39>它应该比较日期。如果 DispatchDate
的 SerialNo
小于 ActivationDate
,则计为1( Product3的 DispatchDate
大于 ActivationDate
。因此会被忽略。其余的SerialNo DispatchDate
是< ActivationDate
)。因此, Activation
表中的总结果数为7。
对于 Despatch
表(Product1,2& 3)中无法比拟的SerialNo,它应该在 Replaced
<中执行匹配/ strong>表。它找到了所有SerialNo的匹配,但由于Product4到Product10已经与 Activation
匹配,因此它应该只匹配3个剩余的SerialNo&#39;产品1,2&amp; ; 3)。产品1&amp;这里有2场比赛。接下来与上面类似,它应该检查 DispatchDate
是否&lt;的 RecordDate
即可。 Product1&amp; 2有 DispatchDate
&lt; RecordDate
因此 Replaced
表中的计数为2。
Installed
应为9(来自 Activation
的表格为7, Replaced
table)。在 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
所以从上图开始,即使是现在,Installed
也应该是9,因为我只希望得到Lot15
答案 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')