Sql 如何从同一表格中的另一行中减去一行?
伙计们,我有两个名为Sql 如何从同一表格中的另一行中减去一行?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,伙计们,我有两个名为Requisition和requisionhistory的表。表请购单是一个主要表,其中唯一的条目基于请购单代码(PK),但在表请购单历史记录中,有多行基于请购单代码,因为每次对请购单表执行任何操作(如更新等),将在请购单历史记录中插入一个新条目 这是我的requision表 +-----------------+---------------+--------------------+ | RequisitionCode | ApprovedCount | Requisit
Requisition
和requisionhistory
的表。表请购单
是一个主要表,其中唯一的条目基于请购单代码
(PK),但在表请购单历史记录
中,有多行基于请购单代码
,因为每次对请购单
表执行任何操作(如更新等),将在请购单历史记录
中插入一个新条目
这是我的requision
表
+-----------------+---------------+--------------------+
| RequisitionCode | ApprovedCount | RequisitionDate |
+-----------------+---------------+--------------------+
| 1 | 10 | 02/01/2014 |
| 2 | 23 | 01/01/2014 |
| 3 | 3 | 02/01/2014 |
+-----------------+---------------+--------------------+
这是我的requisionhistory
表
+------------------------+-----------------+---------------+-----------------+
| 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 |
+------------------------+-----------------+---------------+-----------------+
这些表中还有其他列,但是对于我的查询,它们是不相关的,因此不包括它们
现在我想做的是从requisionhistory
中获取每个requisioncode
的最新(基于requisiondate
)ApprovedCount
,然后从同一requisioncode
的第二个最后条目的ApprovedCount
中减去它(在requisionhistory
中,该requisioncode
可能有一个或多个条目)
我想做的事(但失败得很惨)
我做错了什么?当您尝试以下方法时,您会得到什么:
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
在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
.您的“不在”应该使用RequisitionHistoryCode,因为这是历史记录表的主键。您的意思是“WHERE RequisitionHistoryCode NOT IN…”?我尝试过,但结果相同。
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