Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > update поля по просуммированным данным


Автор: FINANSIST 20.1.2010, 13:21
Задача : просуммировать данные 2-х таблиц (группировка по датам) и вставить сгруппированные и просуммированные данные в 3 временную таблицу
Пытался сделать 1 запросом
Код

INSERT INTO SelectSets ( DateVal, OrderSum, ShippingSum, AutoSelect )
SELECT als.DATA, Sum(f_zak.TON) AS [Sum-TON], Sum(otfact.VES) AS [Sum-VES], True AS Выражение1
FROM f_zak INNER JOIN (otfact INNER JOIN (SELECT distinct otfact.DATA
FROM otfact ORDER BY otfact.DATA) AS als ON otfact.DATA = als.DATA) ON f_zak.DATE = als.DATA
GROUP BY als.DATA, True
ORDER BY als.DATA;

Виснет на неопределенное время
Решил сделать разбить запрос на каскад запросов (все равно в итоге все в VBA модуль запихаю), первый запрос на вставку факт.отгрузок прокатывает 
Код

INSERT INTO SelectSets ( DateVal, ShippingSum, AutoSelect )
SELECT als.DATA, Sum(otfact.VES) AS [Sum-VES], True AS Выражение1
FROM otfact INNER JOIN [SELECT distinct otfact.DATA
FROM otfact ORDER BY otfact.DATA]. AS als ON otfact.DATA = als.DATA
GROUP BY als.DATA, True
ORDER BY als.DATA;



А вот второй (апдейт поля по заказам) не работает
Код

update selectsets,(select date, sum(ton) as ston from f_zak group by date) as als
set selectsets.ordersum = als.ston 
where selectsets.dateval = als.date

Как быть?

Автор: Akina 20.1.2010, 13:27
Сделать подзапрос статическим запросом.

Автор: FINANSIST 20.1.2010, 13:38
Цитата(Akina @  20.1.2010,  13:27 Найти цитируемый пост)
Сделать подзапрос статическим запросом. 


Цитата(FINANSIST @  20.1.2010,  13:21 Найти цитируемый пост)
 в итоге все в VBA модуль запихаю)

Запросы то я удалю потом (и статичные в т.ч.)...

Автор: FINANSIST 20.1.2010, 14:29
В итоге нашел таки дикое решение
Код

Public Sub InsertSelectSets()
Dim sql As String
CurrentDb.Execute "delete * from SelectSets"
Let sql = "INSERT INTO SelectSets ( DateVal, OrderSum, ShippingSum, AutoSelect )"
Let sql = sql & " SELECT ads.DATE, Sum(ads.[Sum-TON]) AS [Sum-Sum-TON], Sum(als.[Sum-VES]) AS [Sum-Sum-VES], True"
Let sql = sql & " FROM (SELECT otfact.DATA, Sum(otfact.VES) AS [Sum-VES] FROM otfact"
Let sql = sql & " GROUP BY otfact.DATA) AS als, (SELECT f_zak.DATE, Sum(f_zak.TON) AS [Sum-TON] FROM f_zak"
Let sql = sql & " GROUP BY f_zak.DATE) AS ads  WHERE ads.Date = [als].[Data] "
Let sql = sql & " GROUP BY ads.DATE, True;"
Debug.Print sql
DoCmd.RunSQL sql, True

Автор: bopoha 22.1.2010, 12:24
Цитата(FINANSIST @  20.1.2010,  14:29 Найти цитируемый пост)
В итоге нашел таки дикое решение

Это суровая реальность.

Я нашел такое решение.
Сперва делается инсерт, который создает пустые записи.
А потом идет несколько updtate, в которых нет групповых функций.
Примерно так:
Код

UPDTAE temp_table INNER JOIN temp_table.K_PK = b_prodazha.K_PRODAZHA
SET temp_table.S_CENA_S_NDS = temp_table.S_CENA_S_NDS + b_prodazha.S_CENA_S_NDS
WHERE b_prodazha.D_OPLATA Is Null AND temp_table.K_OPER = 1;


В результате запросы проще и понятней.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)