2015-10-20 87 views
0

我有一个像下面比较两行

column1 column2 
110   100 
    50   125 
120   80 

我想以这样的方式,我会得到这样的事情

column1 column2 difference 
110   100   0 
    50   125   50 
120   80   5 

或仅仅是一个选择,例如表能够识别区别第2列第一行第二列第一列

+1

区别在于整数减法?你如何计算结果,“0”和“5”? –

+0

@YuZhang因为100没有其他数字要从它减去是'0'125 -120 = 5,100-50 = 50。在列之间对角地进行减法。我实际上想要将这个概念应用于查找meter reading_date与之前due_date之间的差异。 – bob269

回答

2

您可以用LEFT JOIN做到这一点:

SQL Fiddle

WITH Cte AS(
    SELECT *, 
     rn = ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
    FROM tbl 
) 
SELECT 
    t1.*, 
    difference = ISNULL(t2.column2 - t1.column1, 0) 
FROM cte t1 
LEFT JOIN Cte t2 
    ON t1.rn = t2.rn + 1 

由于没有列指示命令,我添加了一个ROW_NUMBER。根据您的偏好修改ORDER BY条款。

1

另一种方式,可能是这样的:

SELECT TB.COLUMN1,TB.COLUMN2, 
(ISNULL(TB2.COLUMN2,TB.COLUMN1)-TB.COLUMN1) AS 'DIF' 
FROM 
(SELECT COLUMN1,COLUMN2,ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS 'R' FROM TEST) TB 
LEFT JOIN 
(SELECT COLUMN1,COLUMN2,ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS 'R' FROM TEST) TB2 
ON TB.R = TB2.R 

直到柱之前,我不知道如何别让ROW_NUMBER“ORDER BY”影响了查询,但基于上面的回答,现在我知道了它,使用select null;)谢谢@Felix Pamittan

+0

不客气。这是我的+1! –