Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/384: Рейтинг темы: голосов - 384, средняя оценка - 4.79
2 / 2 / 0
Регистрация: 28.11.2008
Сообщений: 11

Посчитать процент значения одоной записи от суммы всех записей

18.02.2010, 19:10. Показов 71914. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди добрые, подскажите, кто сталкивался уже или знает решение.
Есть табличка продаж. К примеру:
помидоры - 20
огурцы - 30
яблоки - 50
Как без использования циклов, в операторе select напротив каждого наименования вывести процент продаж по нему от общей суммы?
То есть
помидоры - 20/100
огурцы - 30/100
яблоки - 50/100
Пробовала выкручивать агрегирующие функции, требует group by по названию, что убивает сам смысл суммы. Подзапросы тоже не помогают...
Есть какие-то варианты?

Добавлено через 28 минут
Плохой пример, извиняюсь...
Вот так лучше:
Группа -Наименов. - Количество
овощи - помидоры - 10
овощи - огурцы - 20
овощи - морковь - 50
фрукты - яблоко - 30
фрукты - слива - 70
В запросе показать:
овощи - помидоры - 10% от овощей
овощи - огурцы - 20% от овощей
овощи - морковь - 50% от овощей
фрукты - яблоко - 30% от фруктов
фрукты - слива - 70% от фруктов
Пробовала
T-SQL
1
2
select Группа, Количество/(select sum(Количество) from %Tablename% t1 where t1.Группа=t.Группа)
from %Tablename% t
Ругается, что нельзя выбрать t.Группа потому что ее нет в предложении group by...
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2010, 19:10
Ответы с готовыми решениями:

Посчитать процент от суммы
Не могу получить сумму он те складывает а подставляет рядом см рисунок <!DOCTYPE html> <html> <head> ...

Посчитать процент отклонения показателя от среднего значения
Здравствуйте. Помогите, пожалуйста, посчитать процент отклонения показателя от среднего значения. Честно говоря, не пойму задание..Спасибо.

Массив: Посчитать средний процент заполнения вагонов для всех составов, упорядочить их по этому критерию.
Дан массив поездов. О каждом поезде известно номер поезда, пункт отправления, пункт прибытия, количество вагонов, количество мест в вагоне,...

17
 Аватар для BasicMan
19318 / 2625 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
18.02.2010, 19:28
T-SQL
1
2
3
4
5
6
7
8
select sum(Количество)/sum(a.Колво)*100 as Procent, Наименов, a.Группа
from MyTable 
inner join
(select sum(Количество) as Колво, Группа
from MyTable 
group by Группа)a
on MyTable.Группа=a.Группа
group by Наименов, a.Группа
2
2 / 2 / 0
Регистрация: 28.11.2008
Сообщений: 11
19.02.2010, 11:47  [ТС]
Спасибо, спасибо, все работает)))!!! Доделала.
1
0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 8
05.06.2021, 12:52
Спустя десять лет но все же. Можете мне пояснить по данному запросу.Пробовал под свои значения подогнать данный запрос, но не вышло. Мне нужна подобная сортировка только у меня две таблицы задействованы.
0
5945 / 4521 / 1094
Регистрация: 29.08.2013
Сообщений: 28,101
Записей в блоге: 3
05.06.2021, 15:43
Цитата Сообщение от AndreyMocievich Посмотреть сообщение
Можете мне пояснить по данному запросу
что пояснить?
0
0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 8
06.06.2021, 01:13
Добавлено через 2 часа 7 минут
Есть две таблицы со столбцами:

users(id, country_id)
orders(id, user_id, amount_usd)
Нужно написать запрос, который бы выводил: country_id, user_id и долю от дохода, полученную со страны регистрации пользователя (country_id):

Пример вывода:

country_id user_id percent
RU 12 6.33
BY 112 1.11
RU 632 2.51
UA 231 4.65qwertehok,

Добавлено через 2 часа 24 минуты
Попробовал написать так

T-SQL
1
2
3
4
5
6
7
8
select country_id, user_id, ROUND(amount_usd / (select SUM(a.amount_usd)from orders)* 100) as percent
from users
inner join
(select sum(amount_usd) as amount
from orders
group by country_id)a
on users.country_id=a.country_id
group by a.country_id
Но у меня это не сработало((
0
5945 / 4521 / 1094
Регистрация: 29.08.2013
Сообщений: 28,101
Записей в блоге: 3
06.06.2021, 02:37
Цитата Сообщение от AndreyMocievich Посмотреть сообщение
Но у меня это не сработало((
а должно было?

во первых подзапрос
Цитата Сообщение от AndreyMocievich Посмотреть сообщение
(select sum(amount_usd) as amount
from orders
group by country_id)a
on users.country_id=a.country_id
где у тебя в нем a.country_id?

во вторых запрос
ты выводишь 2 поля
Цитата Сообщение от AndreyMocievich Посмотреть сообщение
select country_id, user_id
а группируешь по одному
Цитата Сообщение от AndreyMocievich Посмотреть сообщение
group by a.country_id
и это я еще не говорю о том что ты берешь из подзапроса поле amount, но нигде его не используешь

ИМХО давайка ты просто найчись таблицы соединять, а потом главу по GROUP BY изучи, а только потом за запрос берись
0
0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 8
06.06.2021, 02:40
Все равно спасибо))
Я сейчас делаю тестовое, чтобы меня взяли на обучение)) вот по этому и на ходу разбираюсь.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
06.06.2021, 10:42
Лучший ответ Сообщение было отмечено pincet как решение

Решение

AndreyMocievich, для решения подобных задач подзапросы не нужны, совсем. Средства для этого появились еще за 5 лет до первого ответа в этой теме.
T-SQL
1
2
3
4
5
6
7
8
select
 u.id, u.country_id,
 sum(o.amount_usd) / sum(sum(o.amount_usd)) over (partition by u.country_id)
from
 users u join
 orders o on o.user_id = u.user_id
group by
 u.id, u.country_id;
1
0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 8
06.06.2021, 11:10
немного подкорректировал запрос.
T-SQL
1
2
3
4
5
6
7
8
select
 u.id, u.country_id,
 sum(o.amount_usd * 100) / sum(sum(o.amount_usd)) over (partition by u.country_id) as percent
from
 users u join
 orders o on o.user_id = user_id
group by
 u.id, u.country_id;
так работает. Спасибо, тебе большое) Ты действительно очень мне помог
0
0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 8
10.06.2021, 10:18
А посидев еще, решение получилось лучше
T-SQL
1
2
3
4
5
6
SELECT u.id,ROUND((o.amount_usd /SUM(o.amount_usd) OVER (PARTITION BY u.country_id))* 100,2) AS percent
FROM users u 
JOIN
 orders o 
  ON o.user_id = user_id
GROUP BY u.id, u.country_id;
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.06.2021, 10:33
Цитата Сообщение от AndreyMocievich Посмотреть сообщение
решение получилось лучше
Решения вообще не получилось.

1. Вы его не проверяли в работе, ибо запрос синтаксически и неверен.
2. Оно основывается на предположении, что в orders не более одной строки для каждого user_id. И в этом случае group by не нужен, который, кстати, тоже неверно написан.
0
0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 8
10.06.2021, 11:14
Ох, как вы ошибаетесь в своих суждениях.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.06.2021, 11:53
AndreyMocievich, показанный вами запрос на MSSQL работать не будет. И это абсолютная истина.
0
0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 8
10.06.2021, 12:10
При этом он прекрасно выполняет свою задачу на MySQL
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.06.2021, 12:38
AndreyMocievich, отлично, мы выяснили, что для вас без разницы MSSQL или MySQL.

Теперь проверим прекрасность выполнения задачи.
Я даже не поленился полигон сделать - https://dbfiddle.uk/?rdbms=mys... b1dee9b24d

ЗЫ: Читайте до полного понимания что такое оконные ранжирующие и агрегирующие функции, и как и когда они работают.
0
0 / 0 / 0
Регистрация: 25.12.2020
Сообщений: 8
10.06.2021, 13:17
Какой ресурс или книгу ты бы порекомендовал для глубокого понимания этой темы?
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.06.2021, 13:55
Лучший ответ Сообщение было отмечено pincet как решение

Решение

AndreyMocievich, не знаю. Лично мне всегда хватало документации.

Добавлено через 25 минут
AndreyMocievich, вообще можно руководствоваться простым правилом - оконные функции применяются не внутри запроса (подзапроса) а к его результату.
Т.е. ваш
T-SQL
1
2
3
4
5
6
SELECT u.id,ROUND((o.amount_usd /SUM(o.amount_usd) OVER (PARTITION BY u.country_id))* 100,2) AS percent
FROM users u 
JOIN
 orders o 
  ON o.user_id = user_id
GROUP BY u.id, u.country_id;
Будет логически эквивалентен
T-SQL
1
2
3
4
5
6
7
8
9
10
11
select
 ROUND((t.amount_usd /SUM(t.amount_usd) OVER (PARTITION BY t.country_id))* 100,2) AS percent
from
 (
  SELECT u.id, u.country_id, o.amount_usd
  FROM users u 
  JOIN
   orders o 
    ON o.user_id = user_id
  GROUP BY u.id, u.country_id
 ) t;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.06.2021, 13:55
Помогаю со студенческими работами здесь

Оптимизация запросов. 3,5+ млн записей в базе. Надо посчитать записи.
И так, сабж. Есть таблица с более чем 3-мя миллионами записей. Выборка делается по примерно 6-ти полям, многие из которых выбираются...

Как посчитать количество записей в одной таблице, соответствующие записи в другой?
Вопрос такой. Есть таблица статей, и таблица с отзывы к ним. Как составить запрос, чтоб в цикле при выводе статьи выводилось количество...

Как отобразить таблицу, выводящую каждое число массива и какой процент это число занимает от суммы всех чисел?
Здравствуйте, пытаюсь решить одну задачу на Си. Подскажите, пожалуйста, в чем может быть ошибка. Полностью задание звучит так:...

core data запрос на получение суммы атрибута, всех записей
Привет, есть сущность продукция имеющая свои атрибуты один из них цена, Есть н продукций нужно найти сумму всех цен Для этого я...

Расчет общей суммы по полю запроса и доли значения каждой записи от общей суммы
Здравствуйте. В БД на аксесс 2013 есть запрос который выводит следующие данные: за выбранный период по договорам с заказчиками выводится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru