在SQL中筛选行

在SQL中筛选行,sql,oracle,data-cleaning,Sql,Oracle,Data Cleaning,我的数据如下所示:数字(字符串)、数字2(字符串)、事务类型(字符串)、成本(整数) 在此处输入图像描述 对于1号,成本10和-10相互抵消,因此剩余成本为100 对于2号,成本50和-50取消,成本87和-87取消 3号的成本仍然是274美元 对于4号,成本316和-316取消,313保留为成本 我要查找的输出如下所示: 如何在SQL中实现这一点 我尝试了“总和(价格)”和“数字”分组,但oracle不让我得到结果,因为还有其他列 你就快到了。。。您需要在不包含其他列的情况下获取每个数字的

我的数据如下所示:数字(字符串)、数字2(字符串)、事务类型(字符串)、成本(整数)

在此处输入图像描述

对于1号,成本10和-10相互抵消,因此剩余成本为100

对于2号,成本50和-50取消,成本87和-87取消

3号的成本仍然是274美元

对于4号,成本316和-316取消,313保留为成本

我要查找的输出如下所示:

如何在SQL中实现这一点

我尝试了“总和(价格)”和“数字”分组,但oracle不让我得到结果,因为还有其他列


你就快到了。。。您需要在不包含其他列的情况下获取每个数字的总和,然后再连接回表

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

您可以使用相关子查询:

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

在执行聚合查询时,必须为每一列选择一个值,方法是将其包含在
group by
中,或者将其包装在聚合函数中

不清楚输出中的第2列和第3列要显示什么,但从示例数据来看,似乎是取了最大值,所以我在这里就是这么做的

select number, max(number2), max(transaction_type), sum(cost)
from my_data
group by number
having sum(cost) <> 0;
选择数字、最大值(数字2)、最大值(交易类型)、总和(成本)
从我的数据
按编号分组
总(成本)为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
具有良好的性能特征。

请将示例数据作为文本而不是图像发布。添加数据类型以提高清晰度。数字、数字2和事务类型是字符串而不是整数数字2和事务类型是我希望在输出中使用的字符串,稍后将用于不同的分析,我只需要在输出中显示此列中的项目。过滤必须在列1(数字)和列(4)上进行,列1(数字)是字符串,列(4)是整数。实际上,它们是字符串还是数字并不重要-您分组的每个“数字”都有多个“数字2”值,因此您必须选择其中一个来显示。在我的示例中,
max()
只是选择按字母顺序排在最后的一个。请尝试运行它,并让我知道输出如何与您想要的不匹配。谢谢Gordon,只是一个更新,列编号、编号2和事务类型是字符串而不是整数。@FirstSlack。所以这段代码对字符串的作用与对整数或日期的作用一样好。这段代码起作用了,我需要在此报表中添加更多列,如何在Oracle中添加更多列,在向结果中添加更多列时是否需要使用相同的keep()和first()函数。@FirstSlack。如果这里没有一个答案能概括你,那么你应该接受其中一个,并提出一个新问题。@FirstSlack。作为OP,您可以单击答案旁边的复选标记以接受它。