0

Access で、いくつかの値の SUM と IF ステートメントの結果を含む計算をコーディングしようとしています。

これは、私が扱っているデータの種類の表です(「CostBaseQuery」から)

CompanyName Year    AssetName  DatapointID  Datapointname                DatapointValue
CompanyA    2011    AssetA     4025         Active operated wells           129
CompanyA    2011    AssetA     4058         API gravity of oil              38.5563255
CompanyA    2011    AssetA     4032         Number of gas lift wells        70
CompanyA    2011    AssetA     4033         Number of wells with ESPs       0
CompanyA    2011    AssetA     4036         Wells with CO2 production       25
CompanyA    2011    AssetA     4035         Wells with H2S production       9
CompanyA    2011    AssetA     4038         Wells with high pressure        0
CompanyA    2011    AssetA     4037         Wells with high temperature     0
CompanyA    2011    AssetA     4034         Wells with scale production     42
CompanyA    2011    AssetA     4039         Wells with wax                  0

計算にはSUM(DatapointValue) WHERE DatapointID IN (4032,4033,4035,4036,4037,4038,4039)が必要です

IF ステートメントから返された値を加算します。

IF (オイルの API 比重 <=5 または >20、ActiveOperatedWells の値を使用、それ以外は 0)

次の方法を使用して計算をコーディングしようとしましたが、SUM 計算と THEN ステートメントを実行するのではなく、SUM の各反復でデータを出力します。

SELECT qb1.CompanyName, qb1.AssetName, qb1.Year, 
(SUM(qb1.DatapointValue) 
+ IIF(qb2.DatapointValue>=5, 
       IIF(qb2.DatapointValue<20, qb3.DatapointValue, 0), 0)) 
AS NumberOfWellCompletions

FROM (CostBaseQuery AS qb1 
     INNER JOIN CostBaseQuery AS qb2 
          ON qb1.CompanyYearAssetID=qb2.CompanyYearAssetID) 
     INNER JOIN CostBaseQuery AS qb3 
          ON qb1.CompanyYearAssetID=qb3.CompanyYearAssetID

WHERE qb1.DatapointID IN (4032,4033,3036,4035,4038,4037,4034,4039)
AND qb2.DatapointID=4058 AND qb3.DatapointID=4025

GROUP BY qb1.CompanyName, qb1.AssetName, qb1.Year, 
qb1.DatapointValue, qb2.DatapointValue, qb3.DatapointValue

これが私の以前のとりとめのないものよりも理にかなっていることを願っています!

4

1 に答える 1

1

この質問は他の SO ユーザーにとってあまり役に立たず、実際の問題については述べていませんが、クエリを好きなようにインデントすると、次のようになります。

SELECT
              b.CompanyName
            , b.AssetName
            , b.Year
            , (
                b.CalculationResult + 
                mp.CalculationResult
              ) AS NumberOfWellCompletions

    FROM
        (
            SELECT 
                          CompanyName
                        , AssetName
                        , Year
                        , SUM(q1.DatapointValue) AS CalculationResult 
                FROM
                        CostBaseQuery AS q1 
                WHERE
                        DatapointID in (
                            4032,
                            4033,
                            3036,
                            4035,
                            4038,
                            4037,
                            4034,
                            4039) 
                GROUP BY
                          CompanyName
                        , AssetName
                        , Year
        ) AS b 
    LEFT JOIN 
        (
            SELECT
                          CompanyName
                        , AssetName
                        , Year
                        , (
                            SUM(
                                IIF(
                                    qb2.DatapointValue>=5, 
                                    IIF(
                                        qb2.DatapointValue<20, 
                                        qb3.DatapointValue,
                                        0),
                                    0)
                          ) 
                FROM
                        CostBaseQuery qb3                   
                WHERE
                        qb3.CompanyName = qb2.CompanyName
                    AND 
                        qb3.AssetName = qb2.AssetName
                    AND
                        qb3.Year = qb2.Year 
                    AND
                        qb3.DatapointID = 4025                   
                GROUP BY 
                          CompanyName
                        , AssetName
                        , Year
        )
    // What is going on here, this doesn't make sense.
    ) AS CalculationResult 
FROM 
          CostBaseQuery AS qb2 
WHERE 
          DatapointID = 4058 
GROUP BY
            CompanyName
          , AssetName
          , Year
 ) AS mp 
    ON 
            (b.CompanyName = mp.CompanyName)
        AND 
            (b.AssetName = mp.AssetName)
        AND
            (b.Year = mp.Year);

ブラケットの数が間違っていることがわかります。アクセス パーサーが構文エラーを示しているようです。

あなたのクエリを書きたいと思うなら、データベースの shcema に関する詳細情報が必要です。ただし、解析可能な SQL を作成する必要があります。

于 2012-09-04T16:33:22.047 に答える