我的数据如下所示,它位于单个表中
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
但这让我无效。
答案 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
它执行Column2
每Column1
的总和,但是,在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