#sql #sorting #sum
#sql #сортировка #сумма
Вопрос:
предположим, у меня есть таблица такого рода:
A B 3
C D 1
E F 2
G H 4
Сумма последнего столбца равна 10, и я хочу, чтобы наибольшие значения составляли не менее 60% от общего значения. Итак, в этом случае он вернет
G H 4
A B 3
Значение увеличивается до 70%, но если было выбрано только 1-е значение, оно увеличится только до 40%. Несмотря на то, что может существовать комбинация, которая вернет ровно 60%, мы хотим взять наибольшие числа.
Итак, я думаю, что знаю, как сортировать значения от наибольшего к наименьшему и как суммировать все значения, но я не знаю, как затем использовать только строки, сумма которых достигает 60%.
Комментарии:
1. По сути, это вычисление текущих итогов. Для какой СУБД это предназначено?
2. Вам нужен процент от общего числа или вы просто выбираете целевое число? Если бы у вас было 100 разных значений, и вы хотели, чтобы сумма всех записей равнялась определенному числу, но не превышала его (например, 453), сработало бы это?
Ответ №1:
--save the whole sum into a variable
summa = select sum(val) from sometable;
select *
from sometable o
where (
select sum(val)
from sometable i
where i.val <= o.val
) >= 0.6*summa;
Комментарии:
1. Ваше использование зарезервированных слов
table
,outer
иinner
делает этот запрос очень трудным для чтения.2. Я думаю, что так и должно быть
i.val <= o.val
. Онлайн-демонстрация data.stackexchange.com/stackoverflow/q/995063. Да, вы правы. И онлайн-демонстрация: я просто говорю вау! Спасибо
Ответ №2:
Я думаю, это дает вам правильный результат. Однако необходимо поработать с временной таблицей, не уверен, можно ли этого избежать.
DECLARE @total bigint
select @total = SUM(value) from SampleTable
select st.*,
convert(decimal(10,2), (select SUM(value) from SampleTable st2 where st2.Value >= st.Value))/@total as percentage
into #temptable
from sampletable st
select * from #temptable
where Value >= (select max(Value) from #temptable where percentage >= 0.6)
Комментарии:
1. для чего нужен порядок по? Вы можете избежать временной таблицы, используя CTE, например.
2. порядок по необходим, поскольку операционной системе требуется x наибольших значений
3. Вы правы. Я должен был упомянуть: Я не эксперт по SQL :-). Удален порядок с помощью
4. оба ответа верны, но у него была онлайн-демонстрация, так что вам остается только показать большой палец 🙂 Спасибо!