2012-08-23 11 views
5

Estoy tratando de mover algunos cálculos de Excel a mi base de datos de Access, pero me enfrento con el error "Consultar demasiado complejo" cuando uso los 5 valores de entrada anteriores. ¿Debo dividir la consulta o hay una manera más eficiente de solucionar esto? ¡Cualquier ayuda sería apreciada! Aquí está el código:Pregunta demasiado compleja

SELECT qb1.CompanyName, qb1.Assetname, qb1.Year, 
     ((qb1.DatapointValue*1000000)+qb2.DatapointValue+ 
     qb3.DatapointValue+qb4.DatapointValue+qb5.DatapointValue+ 
     qb6.DatapointValue) AS MPPOilRevised 

FROM ((((((PEBaseQuery AS qb1 
INNER JOIN PEBaseQuery AS qb2 ON qb1.AssetName=qb2.AssetName) 
INNER JOIN PEBaseQuery AS qb3 ON qb1.AssetName=qb3.AssetName) 
INNER JOIN PEBaseQuery AS qb4 ON qb1.AssetName=qb4.AssetName) 
INNER JOIN PEBaseQuery AS qb5 ON qb1.AssetName=qb5.AssetName) 
INNER JOIN PEBaseQuery AS qb6 ON qb1.AssetName=qb6.AssetName)) 

WHERE qb1.DatapointID=2003 And qb2.DatapointID=2032 
     And qb3.DatapointID=2034 And qb4.DatapointID=2042 
     And qb5.DatapointID=2036 And qb6.DatapointID=2030; 

CompanyName, Year, AssetName, DatapointID, DatapointName, DatapointValue 
CompanyA, 2011, CAAsset1, 2005,  OIL,    170883.740972926 
CompanyA, 2011, CAAsset1, 2032,  Wellwork,  615913 
CompanyA, 2011, CAAsset1, 2034,  Annual shutdown, 0 
CompanyA, 2011, CAAsset1, 2042,  Export,   0 
CompanyA, 2011, CAAsset1, 2036,  Plant,   958387 
CompanyA, 2011, CAAsset1, 2030,  Reservoir,  2394231 
+0

Trate aplanamiento los operandos '' qbX.DatapointValue' en (SELECT ... qbX.DatapointValue DE DONDE ... .) AS ExprX'. – EthanB

+0

Alguna pregunta por separado ... ¿por qué necesita esta multiplicación a 1000000 para el primer DatapointValue? Parece muy extraño, ya que los valores son de una columna. Creo que existe la manera de hacer toda la consulta mucho más simple sin ella. – udalmik

+0

la multiplicación por un millón se debe a que necesito el valor por millón de barriles de petróleo – Magda

Respuesta

3

Parece que necesita una consulta de agregación, en lugar de esta compleja. P.ej.

select companyName, assetName, year, 
    Sum(DatapointValue) as MPPOilRevised 
from PEBaseQuery 
where DatapointID in (2032, 2034, 2042, 2036) 
group by companyName, assetName, year 

El único problema está multiplicando a 1.000.000 para el primer punto de datos. Usted podría intentar IIF para ello:

select companyName, assetName, year, 
    Sum(IIf(DatapointID=2003,DatapointValue*1000000,DatapointValue)) as MPPOilRevised 
from PEBaseQuery 
where DatapointID in (2032, 2034, 2042, 2036) 
group by companyName, assetName, year 

También por favor tratar dicha consulta 'loca', la consulta de este sub DatapointID particular, sin IIF:

select companyName, assetName, year, SUM(DatapointValue) 
     + (select SUM(DatapointValue * 1000000) from PEBaseQuery q2 
      where q2.companyName = q1.companyName 
       and q2.assetName= q1.assetName 
       and q2.year= q1.year 
       and q2.DatapointID = 2003 
      group by companyName, assetName, year) 
    from PEBaseQuery q1 
    where DatapointID in (2032, 2034, 2042, 2036) 
    group by companyName, assetName, year 

Actualización para 'Max Producción Potencial'. Intente lo siguiente:

select b.companyName, b.assetName, IIf(b.calculationResult > mp.calculationResult,b.calculationResult,mp.calculationResult) as MPPOilRevised 
from 
    (select companyName, assetName, year, Sum(IIf(DatapointID=2003,DatapointValue*1000000,DatapointValue)) as calculationResult 
     from PEBaseQuery 
     where DatapointID in (2032, 2034, 2042, 2036) 
     group by companyName, assetName, year) b --Base 
    left join 
    (select companyName, assetName, year, 
     Sum(DatapointValue) as calculationResult 
     from PEBaseQuery 
     where DatapointID = 2218 
     group by companyName, assetName, year) mp -- Max Potential 
    on b.companyName= mp.companyName 
     and b.assetName = mp.assetName 
     and b.year = mp.year 

Ejemplo de cálculo con lógica de resta. Actualizado con SQL loco final. Tenga también en cuenta que yo iría con la lógica de aplicaciones o procedimientos almacenados para este tipo de cosas:

select b.companyName, b.assetName, IIf(b.calculationResult > mp.calculationResult,b.calculationResult,mp.calculationResult) as MPPOilRevised 
from 
    (select companyName, assetName, year, SUM(DatapointValue) 
     + (select SUM(DatapointValue * 1000000) from PEBaseQuery q2 
      where q2.companyName = q1.companyName 
       and q2.assetName= q1.assetName 
       and q2.year= q1.year 
       and q2.DatapointID = 2003 
      group by companyName, assetName, year) 
     - (select SUM(DatapointValue) from PEBaseQuery q2 
      where q2.companyName = q1.companyName 
       and q2.assetName= q1.assetName 
       and q2.year= q1.year 
       and q2.DatapointID = 2029 
      group by companyName, assetName, year) 
    from PEBaseQuery q1 
    where DatapointID in (2032, 2034, 2042, 2036) 
    group by companyName, assetName, year) b --Base 
    left join 
    (select companyName, assetName, year, 
     Sum(DatapointValue) as calculationResult 
     from PEBaseQuery 
     where DatapointID = 2218 
     group by companyName, assetName, year) mp -- Max Potential 
    on b.companyName= mp.companyName 
     and b.assetName = mp.assetName 
     and b.year = mp.year 
+0

¡Buen punto, no vi eso! – Fionnuala

+0

Podría agregar un IIf para la multiplicación, creo. – Fionnuala

+0

intentado actualizar) comprobaré más tarde – udalmik