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 を使用してこれを達成する必要があります