Фильтрация строк в SQL - PullRequest
       3

Фильтрация строк в SQL

0 голосов
/ 19 марта 2019

Мои данные выглядят так: число (строка), число 2 (строка), тип транзакции (строка), стоимость (целое число)

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 ]

1 голос
/ 19 марта 2019

Когда вы делаете агрегированный запрос, вы должны выбрать одно значение для каждого столбца - либо включив его в group by, либо поместив его в агрегатную функцию.

Непонятно, что вы хотите отобразить для столбцов 2 и 3 в выходных данных, но из данных вашего примера похоже, что вы берете MAX, так что я здесь и сделал.

select number, max(number2), max(transaction_type), sum(cost)
from my_data
group by number
having sum(cost) <> 0;
0 голосов
/ 19 марта 2019

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 имеет хорошие рабочие характеристики.

0 голосов
/ 19 марта 2019

Вы можете использовать коррелированный подзапрос:

select t.*
from table t
where t.cost = (select sum(t1.cost) from table t1 where t1.number = t.number);
0 голосов
/ 19 марта 2019

Вы почти там ... вам нужно получить сумму для каждого числа без других столбцов, а затем присоединиться к вашей таблице.

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