2014-09-02 10 views
0

Ребята У меня есть две таблицы с именем Requisition и RequisitionHistory. Таблица 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  | 
+------------------------+-----------------+---------------+-----------------+ 

Есть другие столбцы, а в этих таблицах, однако для моего запроса они не имеют никакого отношения, таким образом, они не являются включен.

Теперь то, что я хочу сделать, это получить последнюю версию (на основе RequisitionDate) ApprovedCount на каждый RequisitionCode из RequisitionHistory, а затем вычесть его из ApprovedCount второй последней записи одних и тех же RequisitionCode (может быть один или несколько записей, которые RequisitionCode в RequisitionHistory)

То, что я пытался сделать (но с треском провалились)

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 таблицы истории. –

+0

Вы имеете в виду «WHERE RequisitionHistoryCode NOT IN ....» ??? Я попробовал, но тот же результат. – NewbieProgrammer

ответ

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 

.

Смежные вопросы