БД доступа выполняет расчет позиции по итоговому значению столбца, прежде чем узнать итоговую сумму - PullRequest
1 голос
/ 01 мая 2009

[редактировать]

Для записи вот проблемная часть запроса, которая сейчас работает:

SELECT 
 m.groupNum, 
 t.ea,
 ( t.ea - ( t.ea * m.margin )) AS estCost,
 (( t.ea - ( t.ea * m.margin )) * t.quantity ) AS salesSub,
 ((( t.ea - ( t.ea * m.margin )) * t.quantity ) / 
   (
    SELECT SUM(( t2.ea - ( t2.ea * m.margin )) * t2.quantity )
    FROM temp as t2
    INNER JOIN masters as m2 
    ON t2.mod = m2.mod
    WHERE m2.groupNum = m.groupNum
    )
  ) AS salesPercent
etc...

[конец редактирования]

Я думаю, что мне нужен запрос, который может рекурсивно обновлять себя на основе суммы значений столбца после вставки значений во все остальные записи для данного диапазона (groupNum).

У меня уже есть поля estCost и salesSub. Теперь мне нужно выполнить вычисления для поля salesPercent , которое включает в себя знание общего количества всех записей salesSub в данном наборе (groupNum).

salesPercent = 
  ( salesSub / [the sum total of all salesSub amounts for each groupNum] )

(надрез)

SELECT 
 m.id, 
 t.priceEach,
 ( t.priceEach - ( t.priceEach * m.margin )) AS estCost,
 (( t.priceEach - ( t.priceEach * m.margin )) * t.quantity ) AS salesSub
 -- is it possible to perform calculation on salesPercent here?
INTO output

FROM financeMasters AS m
INNER JOIN temp AS t .......

(конец обрезки)

У меня есть это ...

------
output
---------------------------------------------------------------
id | groupNum | priceEach | estCost | salesSub | salesPercent |
---------------------------------------------------------------
1  | apple    | 150.00    |  90.00  | 90.00    |   
2  | apple    | 100.00    |  60.00  | 60.00    |   
3  | apple    |  50.00    |  30.00  | 30.00    |   

но как я могу рассчитать salesPercent по итоговой сумме salesSub (в данном случае 180.00), прежде чем узнать общую сумму?

Ответы [ 3 ]

2 голосов
/ 01 мая 2009

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

Примерно так:

SELECT 
 m.id, 
 t.priceEach,
 ( t.priceEach - ( t.priceEach * m.margin )) AS estCost,
 (( t.priceEach - ( t.priceEach * m.margin )) * t.quantity ) AS salesSub,
 ((( t.priceEach - ( t.priceEach * m.margin )) * t.quantity )
     / (SELECT SUM(( t2.priceEach - ( t2.priceEach * m.margin )) * t2.quantity )
        FROM financeMasters AS m2
            INNER JOIN temp AS t2 .....
        WHERE m2.groupNum = m.groupNum))
     AS salesPercent
INTO output

FROM financeMasters AS m
INNER JOIN temp AS t .......

Да, это довольно уродливо. Мне пришлось опустить некоторые детали из-за того, что я не знал, как вы выполняли объединение, а также я не уверен, из какой таблицы исходит groupNum, вы нигде этого не показывали.

1 голос
/ 01 мая 2009

То, что вы собираетесь сделать, это вызвать этот запрос из другого запроса (и объединить его с оригиналом). Предполагая, что ваш запрос называется salesCalc. Это выглядит так (я пропустил соединение):

SELECT m.id, 
    t.priceEach,
    ( t.priceEach - ( t.priceEach * m.margin )) AS estCost,
    (( t.priceEach - ( t.priceEach * m.margin )) * t.quantity ) AS salesSub
INTO output

FROM financeMasters AS m
INNER JOIN temp AS t .......

Вы создадите еще один запрос с именем salesSum. Он использует первый запрос. Вероятно, это будет выглядеть именно так:

select sum(salesSub) as salesGroupTotal, groupNum
from salesCalc
group by groupNum;

Вы создадите третий запрос с именем salesPercent. Он использует как первое, так и второе. Это будет выглядеть так (здесь я также пропустил соединение):

select salesCalc.*,  salesCalc.SalesSub/salesSum.salesGroupTotal
from salesCalc, salesSum
inner join ...

(YMMV) * ​​1013 *

1 голос
/ 01 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...