使用SQL Server 2008中的case语句减去2行

时间:2018-04-25 10:42:38

标签: sql sql-server sql-server-2008

我的数据如下所示,它位于单个表中

Column1   Column2
abc       100
abc       200

现在我需要如下

abc 100 //here 200-100

我正在敲打如何实现这一目标。

我尝试使用row_number,然后使用case语句减去

Select
  column1,
  sum(
    case when rownum=1
    then column2
    end
    -
    case when rownum=2
    then column2
    end
  )
from table
group by column1

但这让我无效。

4 个答案:

答案 0 :(得分:2)

假设没有可以定义行排序的属性 -

;with cte as(
    select
        row_number() over (order by (select null)) as IndexId,
        Column1,
        Column2
    from @xyz
)
select sum(case when IndexID=1 then (-1 * Column2) else Column2 end), Column1
from cte
group by Column1

输入数据 -

declare @xyz table(Column1   varchar(10),Column2 int)
insert into @xyz
select 'abc'       ,100 union all
select 'abc'       ,200

答案 1 :(得分:1)

假设rownum中的属性table始终为1或2(可以根据您的建议由某些row_number()生成,根据任何适合您的顺序)

Column1   Column2  Rownum
------------------------ 
abc       100      1
abc       200      2

然后你可以简单地使用

Select
    column1,
    sum(
        case when rownum=1
        then column2
        else -column2
        end
    )
from table
group by column1

它执行Column2Column1的总和,但是,在rownum = 2的行中,Column2值被否定。因此,在我们的示例中,您最终得到100 +( - 200)= -100

答案 2 :(得分:0)

你可以这样做:

select column1, max(column2) - min(column2)
from t
group by column1;

答案 3 :(得分:0)

如果您关心,以下是上述答案的简短形式:

SELECT
    column1,
    SUM(IIF(rownum=1,column2,-column2))
FROM table
GROUP BY column1