Агрегированный запрос с использованием процентных данных

У меня есть запрос, который вычисляет эффективность добычи нефти для ряда компаний и их активов. На данный момент запрос находится на уровне активов, и мне нужно переписать его, чтобы агрегировать на уровне компании.

Вот код:

SELECT qb1.CompanyName, qb1.AssetName, qb1.Year,
       (((qb1.DefaultOil*1000000)/qb2.MPPOil)*100) AS PEOIL
FROM PE_Field_OIL_GAS AS qb1 
INNER JOIN PE_Field_MPPOilRevised AS qb2 
ON qb1.Assetname=qb2.AssetName;

Он основан на расчете:

((OIL × 1000000) ÷ MPP Oil пересмотрено) × 100

Где MMPOil — вычисляемый столбец в другом поле.

Пример того, как работает агрегированный расчет, приведен ниже:

(((НЕФТЬ актива A × 1000000) + (НЕФТЬ актива A × 1000000)) ÷ (пересмотренная нефть MPP актива A + пересмотренная нефть MPP актива B)) × 100

Обратите внимание, что этот запрос выводит процент, так что это не просто случай суммирования всех данных на уровне активов! Любая помощь приветствуется :)


person Magda    schedule 29.08.2012    source источник


Ответы (1)


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

SELECT qb1.CompanyName, qb1.Year,
       (((sum(qb1.DefaultOil)*1000000)/sum(qb2.MPPOil))*100) AS PEOIL
FROM PE_Field_OIL_GAS AS qb1 
INNER JOIN PE_Field_MPPOilRevised AS qb2 
ON qb1.Assetname=qb2.AssetName
GROUP BY qb1.CompanyName, qb1.Year;
person Nikola Markovinović    schedule 29.08.2012
comment
Извините, у меня есть еще один вопрос, для той же структуры расчета, но с другими переменными, я получаю сообщение об ошибке «Переполнение», я предполагаю, что это потому, что значения слишком длинные. У вас есть идеи, как я могу округлить данные до ближайшего целого числа? ? (Я мог бы добавить эту функцию к расчету активов в моем вопросе) - person Magda; 29.08.2012
comment
@Magda В MS Access есть круглая функция, но я не думаю поможет. Overflow, вероятно, возникает из-за пересечения границы значения типа переменной. В этом случае вы можете использовать более широкую числовую переменную - преобразовать qb1.DefaultOil и qb2.MPPOil в double используя CDbl. - person Nikola Markovinović; 29.08.2012
comment
Я попытался преобразовать их обоих в двойные, но ошибка осталась, я попытался преобразовать их оба в целые числа без десятичных знаков, но проблема все еще остается: S - person Magda; 29.08.2012
comment
@Magda Что такое точное сообщение об ошибке? Вы получаете его при выполнении запроса отдельно или из формы/отчета? Какие типы данных DefaultOil и MPPOil? Ах, если диапазон сильно отличается, деление может создать эту проблему - сработает ли это, если вы сначала разделите, а затем умножите на сто миллионов? - person Nikola Markovinović; 29.08.2012
comment
Точное сообщение об ошибке - Overflow. Я получаю его при выполнении запроса в одиночку. Запрос, который вы отправили в качестве ответа с DefaultOil и MPPOil, работает, проблема, с которой я столкнулся, связана с аналогичным расчетом с использованием WellworkOil и MPPOil. Код SELECT qb1.CompanyName, qb1.Year, ((sum(qb1.ExportOIL)*1000000) /sum(qb2.MPPOil))*100 AS ExportOIL FROM PE_Field_ExportOIL AS qb1 INNER JOIN PE_Field_MPPOilRevised AS qb2 ON qb1.Assetname=qb2.AssetName GROUP BY qb1.CompanyName, qb1.Year; ExportOil имеет значения данных между 0-51 (это проценты) MPPOil имеет значения между 0-104066918 - person Magda; 29.08.2012
comment
@Magda Я полагаю, что в сумме (MPPOil) есть значение, близкое к нулю, что приводит к переполнению деления. Не могли бы вы проверить наименьшее значение в этой сумме и удалить эту компанию из запроса, чтобы проверить эту гипотезу? - person Nikola Markovinović; 29.08.2012
comment
Извините, мне удалось заставить его работать сейчас. Одним из значений в наборе данных запроса WellworkOil было «#Num!». после его удаления запрос смог выполнить - person Magda; 29.08.2012
comment
@Magda Рада, что все получилось хорошо. - person Nikola Markovinović; 29.08.2012
comment
Еще раз спасибо за помощь, очень ценю :) - person Magda; 29.08.2012