2014-09-02 156 views
0

伙计们我有两个表名为RequisitionRequisitionHistory。表Requisition是其中具有基于RequisitionCode(PK)的唯一条目的主要表格,但是在表RequisitionHistory中存在基于RequisitionCode的多行,因为每次在Requisition表上执行任何动作(例如更新等)时,新的条目插入RequisitionHistory如何从同一个表中的另一行中减去一行?

这是我Requisiton

+-----------------+---------------+--------------------+ 
| RequisitionCode | ApprovedCount | RequisitionDate | 
+-----------------+---------------+--------------------+ 
|    1 |   10 | 02/01/2014   | 
|    2 |   23 | 01/01/2014   | 
|    3 |    3 | 02/01/2014   | 
+-----------------+---------------+--------------------+ 

这是我RequisitionHistory

+------------------------+-----------------+---------------+-----------------+ 
| RequisitionHistoryCode | RequisitionCode | ApprovedCount | RequisitionDate | 
+------------------------+-----------------+---------------+-----------------+ 
|      1 |    1 |   14 | 01/01/2014  | 
|      2 |    1 |   10 | 02/01/2014  | 
|      3 |    2 |   23 | 01/01/2014  | 
|      4 |    3 |    1 | 01/01/2014  | 
|      5 |    3 |    3 | 02/01/2014  | 
+------------------------+-----------------+---------------+-----------------+ 

还有其他列,以及在这些表中,但我查询他们无关因而他们不包括在内。

现在我想要做的就是从RequisitionHistory得到每各RequisitionCode最新(基于RequisitionDateApprovedCount,然后从同一RequisitionCode(可能有单个或多个的那项的倒数第二项的ApprovedCount减去它RequisitionCodeRequisitionHistory

我试图这样做(但惨败)

select RequisitionCode , 
(ISNULL((select top 1 ApprovedCount from RequisitionHistory 
where RequisitionCode =r.RequisitionCode order by RequisitionDate desc),0) 
- 
ISNULL(
(select top 1 ApprovedCount from RequisitionHistory where RequisitionCode 
NOT IN 
(select top 1 ApprovedCount from RequisitionHistory 
where RequisitionCode =r.RequisitionCode order by RequisitionDate desc) 
and RequisitionCode = r.RequisitionCode order by RequisitionDate DESC),0)) 
as StructureChange from Requisition r 

我在做什么错?

+0

您的“NOT IN”应该使用RequisitionHistoryCode,因为那是历史记录表的PK。 – 2014-09-02 13:06:04

+0

你的意思是“Where RequisitionHistoryCode NOT IN ....”?我尝试过,但结果相同。 – NewbieProgrammer 2014-09-02 13:14:57

回答

0

当您尝试这个,你能得到什么:

select RequisitionCode , 
(
ISNULL((select top 1 ApprovedCount from RequisitionHistory rh 
where rh.RequisitionCode =r.RequisitionCode order by rh.RequisitionDate desc),0) 
- 
ISNULL(
(select top 1 ApprovedCount from RequisitionHistory rh1 where rh1.RequisitionHistoryCode 
NOT IN 
    (select top 1 RequisitionHistoryCode from RequisitionHistory rh2 
    where rh2.RequisitionCode =r.RequisitionCode order by rh2.RequisitionDate desc) 
    and rh1.RequisitionCode = r.RequisitionCode order by rh1.RequisitionDate DESC),0)) 
as StructureChange 
from Requisition r 
0

在SQL Server中,你可以在一个稍微更可读的方式做到这一点:

WITH AprovalRecency AS (
    SELECT RequisitionCode, ApprovedCount, 
     RANK() OVER (PARTITION BY RequisitionCode 
        ORDER BY RequisitionHistoryCode DESC) as Recency 
    FROM RequisitionHistory 
    WHERE) 
    SELECT r.*, COALESCE(ar2.ApprovedCount, 0) - COALESCE(ar1.ApprovedCount, 0) 
    FROM Requisition r LEFT JOIN 
    AprovalRecency ar1 ON r.RequisitionCode = ar1.RequisitionCode 
         AND ar1.Recency = 1 LEFT JOIN 
    AprovalRecency ar2 ON r.RequisitionCode = ar2.RequisitionCode 
         AND ar2.Recency = 2 

相关问题