SQL select语句从第二行获取计算列

时间:2014-11-15 17:41:41

标签: sql sql-server sql-server-2005

我有这样的表

c1   c2 
25   30
42   28
50   15

如何使用sql select语句

获取如下表格
c1  c2    c3   c4
25  30    0    0
42  28    -3   45  
50  15   27   33

-3来自25-28& 45来自42 - ( - 3) 我必须使用前一行进行计算

2 个答案:

答案 0 :(得分:2)

您可以使用OUTER APPLY获取以前的记录,因为LAG在SQL Server 2005中不可用:

SELECT t.*, COALESCE(t1.c1 - t.c2, 0) AS c3, COALESCE(t.c1 - (t1.c1 - t.c2), 0) AS c4
FROM @T AS t
OUTER APPLY (
   SELECT TOP 1 *
   FROM @T
   WHERE id < t.id
   ORDER BY id DESC
) t1
ORDER BY t.id

以此为输入:

DECLARE @T TABLE (id INT, c1 INT, c2 INT)

INSERT @T VALUES
(1, 25, 30),
(2, 42, 28),
(3, 50, 15)

你得到这个输出:

id  c1  c2  c3  c4
-------------------
1   25  30  0   0
2   42  28  -3  45
3   50  15  27  23

如果您的表没有自动增量ID作为PK,那么您可以按c1排序(如果这真正满足您对之前记录的要求)。

答案 1 :(得分:1)

试试这个。使用Left JoinRow_Number()即可获得结果。在最后一列中您的预期输出中存在错误,最后一行值应为23而不是33,因为您已说C4=C1-c3所以50-27应为23而不是33 {1}}

CREATE TABLE #t
  (c1 INT,c2 INT)

INSERT #t
VALUES( 25,30),
       (42,28),
       (50,15);

WITH cte
     AS (SELECT Row_number()OVER (ORDER BY c1) rn,*
         FROM   #t)
SELECT a.c1,a.c2,
       Isnull(CASE WHEN b.rn IS NOT NULL THEN (SELECT c1 FROM cte
                                               WHERE  rn = a.rn - 1) - a.c2
              END, 0)            c3,
       Isnull(a.c1 - ( CASE WHEN b.rn IS NOT NULL THEN (SELECT c1 FROM   cte
                                                        WHERE  rn = a.rn - 1) - a.c2
                       END ), 0) c4
FROM   cte a
       LEFT JOIN cte b ON a.rn = b.rn + 1 

输出:

c1  c2  c3  c4
--  --  --  --
25  30  0   0
42  28  -3  45
50  15  27  23