2015-03-02 62 views
0

我有两个表:匹配在SQL Server的两个表2008

  1. 迪斯派奇
  2. 激活

Despatch表包含有关厂商派出的产品数据,即DispatchDateLotQty

激活表包含由供应商发送的安装在客户住宅中的产品的数据Despatch表,即ActivationDateLotQty

随着下面的查询我设法与一些问题,以取得数据的帮助下,

select 
(
    select distinct QTY 
    from Despatch 
    where LOTQty = '1007' 
)as LotQty 

,(
    select COUNT(ProductNumber) 
    from Despatch 
    where LOTQty = '1007' 
)as ApprovedQty 

,(
    select distinct(DispatchDate) 
    from Despatch 
    where LOTQty = '1007' 
)as DispatchDate 

,(
    select distinct(ProductModel) 
    from Despatch 
    where LOTQty = '1007' 
)as Model 

,(
    select COUNT(ProductNumber) 
    from Activation 
    where LotQty = '1007' 
)as Installed 

其中产量如下结果:
enter image description here

但在上面的例子中,它需要完整的安装数据。我的要求是每个productNumber在这个特殊的地段,它应该首先检查发货日期。如果安装表的激活日期大于Despatch表的DispatchDate,则应该考虑该条目否则忽略它。

EDITED:
我需要的是大致一样的东西提前这个

( 
select COUNT(ProductNumber) 
from Activation 
where LotQty = '1007'and ActivationDate in Activation for that ProductNumber > DispatchDate in Despatch for the same ProductName 
)as Installed 

感谢。

+0

是'LotQty'表之间的(唯一的)链接?你能分享桌子的DDL吗?你真的想用查询来实现什么? – NickyvV 2015-03-02 09:36:35

+0

DispatchDate和ProductModel在LOTQty中是唯一的吗? – 2015-03-02 09:41:19

+0

@Giorgi Nakeuri yes在LotQty中,DispatchDate和ProductModel是唯一的。对于型号A,lotQty 500的发货日期全部相同 – 2015-03-02 09:45:16

回答

0

您可以尝试通过Dispath表OUTER APPLY表达和组过滤激活行:

DECLARE @D TABLE 
    (
     LotQty NVARCHAR(50) , 
     ProductNumber NVARCHAR(50) , 
     DispatchDate DATE , 
     ProductModel NVARCHAR(50) 
    ) 
DECLARE @A TABLE 
    (
     LotQty NVARCHAR(50) , 
     ProductNumber NVARCHAR(50) , 
     ActivationDate DATE 
    ) 


INSERT INTO @d 
VALUES ('1007', 'N1', '20150112', 'ModelA'), 
     ('1007', 'N2', '20150112', 'ModelA'), 
     ('1007', 'N3', '20150112', 'ModelA'), 
     ('1007', 'N4', '20150112', 'ModelA'), 
     ('1007', 'N5', '20150112', 'ModelA') 

INSERT INTO @A 
VALUES ('1007', 'N1', '20150101'), 
     ('1007', 'N1', '20150102'), 
     ('1007', 'N2', '20150101'), 
     ('1007', 'N2', '20150113'), 
     ('1007', 'N2', '20150114'), 
     ('1007', 'N3', '20150205'), 
     ('1007', 'N4', '20150207'), 
     ('1007', 'N5', '20150101') 

SELECT d.LotQty , 
     COUNT(d.ProductNumber) AS ProductNumber , 
     MAX(DispatchDate) AS DispatchDate , 
     MAX(ProductModel) AS ProductModel , 
     SUM(o.c) AS Installed 
FROM @D d 
     OUTER APPLY (SELECT COUNT(*) AS c 
         FROM  @A a 
         WHERE  d.LotQty = a.LotQty 
           AND d.ProductNumber = a.ProductNumber 
           AND a.ActivationDate > d.DispatchDate 
         GROUP BY a.LotQty , 
           a.ProductNumber 
        ) AS o 
WHERE d.LotQty = '1007' 
GROUP BY d.LotQty 

输出:

LotQty ApprovedQty  DispatchDate ProductModel Installed 
1007 5    2015-02-15  ModelA   4