powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Сумма с накоплением
25 сообщений из 25, страница 1 из 1
Сумма с накоплением
    #32557869
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут недавно столкнулся с проблемой выделить фирмы которые занимают 80% от общего объема продаж. Причем это может относится и к общему объему и к группам товаров и к товарам. В отчетах это реально (функция RunningSum) а как посчитать в формах или запросах
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557902
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТут недавно столкнулся с проблемой выделить фирмы которые занимают 80% от общего объема продаж.

пример:

фирма; объем продаж
-----------------------
1; 10
2; 20
3; 10
4; 40
5; 20

вариантов ответов несколько:
1 2 3 4
1 3 4 5
2 4 5

какой надо получить? И это только при строгом соответствии :)
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557913
Alexander Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Paparome
Ты не повериш но у меня позавчера стояла такая задача =)))
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557924
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander PopovTo Paparome
Ты не повериш но у меня позавчера стояла такая задача =)))

Задача о рюкзаке - блин :)
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557925
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь не сказал главного. Нужны самые крупные фирмы (по объему)
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557956
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SELECT x1.name, x1.xxx, Sum(x2.xxx) as s1,  100  * Sum(x2.xxx) / (Select Sum(xxx) From Таблица3) as pr
FROM Таблица3 x1 inner join Таблица3 x2 on ((x1.xxx<x2.xxx) or ((x1.xxx=x2.xxx) And (x1.name>=x2.name)))
Group by x1.name, x1.xxx
Order by x1.xxx desc;

ЧТо-то в этом духе :)
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557974
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
Order by x1.xxx desc, x1.name;

кончно же :)
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557975
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ
Считаю, что name уникально!
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557989
Alexander Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сделал так: подсчитал общую сумму потом задал вечный цикл в котором курсор и условие на проверку.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare @itog float ( 8 )
Set @itog=(Select Sum(itog) From table)

Declare cursor_Summ Cursor for
Select id, itog From table
open cursor_Summ
while  1 = 1 
             begin 
                declare @id int, @Sum float ( 8 )                
                fetch next From cursor_Summ into @id, @Sum
                
                IF @@FETCH_STATUS <>  0   BREAK
               
                    if @Sum<((@@itog/ 100 )* 80 )
                    Begin
                      insert into #t (id, Sum)
                      Values(@id, @Sum)
                    end 
                     else
                    break           
             end
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557990
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К paparome
Слушай я так понял ты завернул сразу с рассчетом процентов? проценты я сделаю это не проблема, а вот сумма с накоплением да. я попробовал понять, что ты написал, но что-то туго получается Х-сов слишком много в глазах. Напиши если можно как для чайников (по-подробнее)
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32557997
Alexander Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри в этом месте нужно вот так
Код: plaintext
1.
2.
Declare cursor_Summ Cursor for
Select id, itog From table order by itog

До тех пор пока у тебя суммы продаж не вылезут за 80% данные будут копироватся во временную таблицу
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558013
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
SELECT tbl1.[Название фирмы], tbl1.[кол-во продаж], Sum(tbl2.[кол-во продаж]) AS [сумма продаж всех фирм, что выше этой (включительно)],  100  * Sum(tbl2.[кол-во продаж]) / (Select Sum([кол-во продаж]) From [Фирмы]) AS [Процент (предыдущее поле деленное на общую сумму продаж)]
FROM Фирмы AS tbl1 INNER JOIN Фирмы AS tbl2 ON (tbl1.[кол-во продаж]<tbl2.[кол-во продаж]) or ((tbl1.[кол-во продаж]=tbl2.[кол-во продаж]) And (tbl1.[Название фирмы]>=tbl2.[Название фирмы]))
GROUP BY tbl1.[Название фирмы], tbl1.[кол-во продаж]
ORDER BY tbl1.[кол-во продаж] DESC , tbl1.[Название фирмы];

Пожалуйста - если так понятнее :( (читабельность (ИМХО) снизилась)
[Название фирмы] - уникальное поле (как я уже говорил)
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558032
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щас попробую. заранее благодарен
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558071
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 NikP
Код: plaintext
 Напиши если можно как для чайников (по-подробнее)
В принципе все просто .
Предположим , что имеем таблицу t
Код: plaintext
1.
2.
3.
id      Qty
 1         100 
 2         200 
 3         300 
Получить сумму с накоплениями можно двумя способами
1 Через кореллированный подзапрос
Код: plaintext
1.
select t.id,(select sum(qty) from t as t1 where t1.id<=t.id)  RunningSum
from t

2 Через самообьединение (как делал paparome)
Код: plaintext
1.
2.
select t.id,sum(t1.qty) RunningSum
from t inner join t as t1 on t1.id<=t.id
group by t.id
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558172
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К (c)VIG
Сделал как ты написал, через самообьединение (как делал paparome) + небольшие добавки

SELECT [Таб].[Фирма], [Таб].[Тоннаж], sum([Таб].[Тоннаж]) AS RunningSum
FROM Таб INNER JOIN Таб AS Таб1 ON Таб1.Фирма<=[Таб].[Фирма]
GROUP BY [Таб].[Фирма], [Таб].[Тоннаж]
ORDER BY [Таб].[Тоннаж] DESC , [Таб].[Фирма];

Работать работает, но проверить правильно считает или нет не могу. пытался проверять также как в варианте с отчетами полная хрень получается
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558204
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К (c)VIG
Ну я и стормозил поставил AS перед RunningSum (он мне ошибку выдавал)
RunningSum это я так понимаю не функция конкретная ее расписывать надо
Я правильно понял? Если да распиши пожалуйста у тебя все коротко и понятно
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558222
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSELECT [Таб].[Фирма], [Таб].[Тоннаж], sum([Таб].[Тоннаж]) AS RunningSum
FROM Таб INNER JOIN Таб AS Таб1 ON Таб1.Фирма<=[Таб].[Фирма]
GROUP BY [Таб].[Фирма], [Таб].[Тоннаж]
ORDER BY [Таб].[Тоннаж] DESC , [Таб].[Фирма];

Это (ИМХО) работает не правильно - ибо
GROUP BY ... [Таб].[Тоннаж]
даст такой результат:
sum([Таб].[Тоннаж]) = [Таб].[Тоннаж]
т.е. ИМХО - надо ставить sum([Таб1].[Тоннаж])

И в данном запросе суммирование с накоплением идет для сортировки по полю фирма (это я не про ордер, а про условие объединения Таб1.Фирма<=[Таб].[Фирма] )
В ТЗ явно другое было сказано :(

2 автор
чем вам мой вариант не угодил?
почти готовый запрос (опять же ИМХО)
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558354
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К Paparome
Я не сильно продвинут во всем этом. Взял что по-короче. Сейчас обработал твой вариант (склеил первый короткий и второй подробный у себя в мозгах). Вроде получилось. Только вот ошибку выдает не находит Таб3. Я честно говоря сам не до конца догнал что ты имел ввиду под Таблица3(1вариант) и Фирмы(2вариант). Подскажи будь другом

SELECT [Таб].[Фирма], [Таб].[Тоннаж], sum([Таб1].[Тоннаж]) AS Тоннаж1, 100*sum([Таб1].[Тоннаж])/(Select Sum([Тоннаж]) From Таб3) as proc
FROM Таб3 As Таб INNER JOIN Таб3 AS Таб1 ON (([Таб].[Тоннаж]<[Таб1].[Тоннаж]) or ([Таб].[Тоннаж]=[Таб1].[Тоннаж]) and ([Таб].[Фирма]>=[Таб1].[Фирма]))
GROUP BY [Таб].[Фирма], [Таб].[Тоннаж]
ORDER BY [Таб].[Тоннаж] DESC , [Таб].[Фирма];
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558366
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ честно говоря сам не до конца догнал что ты имел ввиду под Таблица3(1вариант) и Фирмы(2вариант). Подскажи будь другом

Дык - я когда запрос отлаживал, не знал как ваша табла называется - вот и дал ей название, какое мне понравилось :)
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558480
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К Paparome
Все работает!!! Просто супер! Спасибо огромное!
Предоставляю последний вариант. Кто знает может кто-нибудь так же как и я не до конца все понял.

SELECT [Таб].[Фирма], [Таб].[Тоннаж], sum(Таб1.Тоннаж) AS Тоннаж1, 100*sum([Таб1].[Тоннаж])/(Select Sum([Тоннаж]) From [Исходная Таб]) AS [Проценты]
FROM [Исходная Таб] AS Таб INNER JOIN [Исходная Таб] AS Таб1 ON ([Таб].[Тоннаж]<Таб1.Тоннаж) Or ([Таб].[Тоннаж]=Таб1.Тоннаж) And ([Таб].[Фирма]>=Таб1.Фирма)
GROUP BY [Таб].[Фирма], [Таб].[Тоннаж]
ORDER BY [Таб].[Тоннаж] DESC , [Таб].[Фирма];
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558734
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 NikP
Ты бы привел структуру таблицы и тестовые данные, было бы проще.
А так могу сказать , что в общем случае твой запрос (впрочем ,как и у paparome) будет не правильно работать. Хотя в частных случаех может давать и правильный результат.
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558958
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К (c)VIG
Обижаешь! Я просто так Ура! не кричу. Все протестировал. Кинул результаты в Excel проставил формулы все It's very good
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32558995
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 NikP
Рад за тебя.
Но что даст твой запрос при таких вот исходных данных?

Код: plaintext
1.
2.
3.
4.
5.
6.
Фирма   Тоннаж
f_a     100 
f_a     100 
f_a     200  
f_b     100 
f_b     100 
f_b     200 
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32561032
NikP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К (c)VIG
Понимаешь в чем дело если ты заранее не сделаешь запрос с группировкой по фирме и Sum по отгрузке, то конечно получишь полную чушь. Я согласен, что запрос можно дополнить, чтобы не делать сначала один запрос, а потом другой. Но для меня важен был сам процесс рассчета суммы с накоплением, а остальное мелочи жизни
...
Рейтинг: 0 / 0
Сумма с накоплением
    #32561051
Фотография paparome
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(c)VIG2 NikP
Рад за тебя.
Но что даст твой запрос при таких вот исходных данных?

Код: plaintext
1.
2.
3.
4.
5.
6.
Фирма   Тоннаж
f_a     100 
f_a     100 
f_a     200  
f_b     100 
f_b     100 
f_b     200 


VIG - обитеть хотишь?
Ястно, что незная структуры таблицы, я взял название фирмы как ключевое поле (ну должно же быть ключевое поле - вот его и используем)

me от 11 июн 04, 12:46 ЗЫ
Считаю, что name уникально!

PS: Это и ужу понятно, что при отсутствии уникальности по наме фигня получится!!!
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Сумма с накоплением
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]