我有这样的表
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) 我必须使用前一行进行计算
答案 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 Join
和Row_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