在SQL中过滤行

时间:2019-03-19 17:11:21

标签: sql oracle data-cleaning

我的数据如下:Number(String),Number2(String),Transaction Type(String),Cost(Integer)

enter image description here

在此处输入图片描述

对于数字1,费用10和-10会被抵消,因此剩余费用为100

对于数字2,费用50和-50取消,费用87和-87取消

第3位,费用仍为274

对于第4个,费用316和-316取消,费用仍为313

我正在寻找的输出看起来像这样:  enter image description here

如何在SQL中执行此操作?

我尝试过“ sum(price)”并按“ number”进行分组,但是由于其他列,oracle不允许我得到结果

https://datascience.stackexchange.com/questions/47572/filtering-unique-row-values-in-sql

4 个答案:

答案 0 :(得分:1)

进行汇总查询时,您必须为每一列选择一个-通过将其包含在group by中或将其包装在汇总函数中。

尚不清楚您要在输出中的第2列和第3列显示什么,但是从示例数据来看,您似乎正在使用MAX,所以这就是我在这里所做的。

select number, max(number2), max(transaction_type), sum(cost)
from my_data
group by number
having sum(cost) <> 0;

答案 1 :(得分:0)

您快要到了……您需要获取每个数字的总和,而无需其他列,然后再加入表中。

select * from table t
join
(select number,sum(cost)
from table
group by number) sums on sums.number=t.number

答案 2 :(得分:0)

您可以使用相关子查询:

select t.*
from table t
where t.cost = (select sum(t1.cost) from table t1 where t1.number = t.number);

答案 3 :(得分:0)

Oracle具有与first()相当好的功能。 。 。但是语法有点麻烦:

select number,
       max(number2) keep (dense_rank first order by cost desc) as number2,
       max(transaction_type) keep (dense_rank first order by cost desc) as transaction_type,
       max(cost) as cost
from t
group by number;

根据我的经验,keep具有良好的性能特征。