2

MS Query を使用して、Excel 2007 でパイプラインの固定セットの月額料金を表示する必要があります。パイプラインに月額料金がない場合でも、この方法で表示する必要があります。

必要な出力

SQL Server 2008 R2 で次のコードを使用して実行しました。

SELECT P.Name     AS [Pipeline Name], 
       PR.Id, 
       PR.[Name], 
       PH.[Value] AS Rate 
FROM   [GAS].[dbo].[Pipelinerate] PR 
       INNER JOIN Pipeline P 
               ON P.Id = PR.Pipelineid 
       LEFT OUTER JOIN [GAS].[dbo].[Pipelineratehistory] PH 
               ON PH.[Pipelinerateid] = PR.[Id] 
               AND ( PH.[Month] = ?   --Month
                     AND PH.[Year] = ? )  --Year
WHERE  ( PR.[Id] IN ( 197, 198, 1, 2, 3, 5, 67, 68, 23 ) ) 
       AND ISNULL(PH.Deprecated, 'n') <> 'Y' 
ORDER  BY [Pipeline name], 
          PR.[Name] 

Excel 2007 の MS Query で実行しようとすると、次のエラーが表示されます。

[Microsoft][ODBC SQL Server Driver] Invalid Parameter Number

[Microsoft][ODBC SQL Server Driver] Invalid Descriptor Index

試行錯誤により、ON句からパラメーターを使用して条件を削除しWHERE Clause、以下のように入れるとわかりました

SELECT P.Name     AS [Pipeline Name], 
       PR.Id, 
       PR.[Name], 
       PH.[Value] AS Rate 
FROM   [GAS].[dbo].[Pipelinerate] PR 
       INNER JOIN Pipeline P 
               ON P.Id = PR.Pipelineid 
       LEFT OUTER JOIN [GAS].[dbo].[Pipelineratehistory] PH 
               ON PH.[Pipelinerateid] = PR.[Id] 
WHERE  ( PR.[Id] IN ( 197, 198, 1, 2, 3, 5, 67, 68, 23 ) ) 
       AND ( PH.[Month] = ?   --Month
             AND PH.[Year] = ? )  --Year
       AND ISNULL(PH.Deprecated, 'n') <> 'Y' 
ORDER  BY [Pipeline name], 
          PR.[Name] 

コードは MS Query で機能し、次の結果が得られます

実際の出力

この出力では、その月に料金が設定されていないパイプラインは表示されていません。したがって、このコードは機能しません。LEFT JOINしたがって、MS Queryを使用してExcelで目的の出力を取得するために、この場合の代替手段を見つけようとしています。

関連
Pipeline および PipelineRate - オプションの 1 対多の関係
PipelineRate および PipelineRateHistory - オプションの 1 対多の関係

左結合の代替案、またはこれを達成する方法を誰かが提案できますか?

PS: ストアド プロシージャを使用できません。VBAを使用してこれを行う方法を知っています。MS Query を使用してこれを達成する必要があります

4

3 に答える 3