[Plan Revenue]、[Plan Revenue Expense]、[Support Provider]、[Z Service Codes New] の複数のテーブルを含むデータベースがあります。
過去 6 か月間に特定のサービス コードで各プロバイダーにリストされた経費レコードの数をカウントするクエリを既に作成しています。唯一の問題は、理想的には、過去 6 か月間に費用が記録されていないサービス コードにも 0 をリストすることです。
したがって、基本的には、[Z Service Codes New] テーブルと [Support Providers] テーブルをクロスして、プロバイダーとすべてのサービス コードの間で考えられるすべての一致を取得したいと考えています。次に、各サービス コード内で、過去 6 か月以内の経費レコードの数をカウントするようにします (実際にはカスタム日付を設定して、より柔軟にしています)。
しかし、すべての経費レコードをすべてのサービス コードと照合するのではなく、正しいサービス コード内に該当する経費レコードのみを照合するように、これを行う方法に行き詰まっています。
[Plan Revenue].[Service] は、[Z Service Codes New].[Service Code] [Plan Revenue].[Rev ID] は、[Plan Revenue Expense] まで一致する外部キーです。 [RevID] [Plan Revenue Expense].[SP] は、[Support Provider].[ID] に一致する外部キーです。
簡単にするために、データベース ビルダーがテーブル間でキーを一致させなかった理由を聞かないでください。それはまさにそれが何であるかです...
私の現在のクエリは次のようになります。
SELECT [support provider].[sp last],
[support provider].[sp first],
[support provider].[sp mi],
[support provider].[agency],
[support provider].[de?],
[support provider].[ic?],
[support provider].[agency?] AS [AG?],
[support provider].[generalbus?] AS [GB?],
[ExpsToCount].[counted svc],
Iif(Count([ExpsToCount].[exptocountid]) = 0, 0, Count(
[ExpsToCount].[exptocountid])) AS ExpCount
FROM [support provider]
LEFT JOIN (SELECT [plan revenue expense].[sp] AS [Counted SP],
[z service codes new].[service code] AS [Counted Svc],
[plan revenue expense].[exp id] AS [ExpToCountID]
FROM [z service codes new]
LEFT JOIN ([plan revenue]
LEFT JOIN [plan revenue expense]
ON [plan revenue].[rev id] =
[plan revenue expense].[revid])
ON [z service codes new].[service code] =
[plan revenue].[service]
WHERE ( [plan revenue expense].[checkdt] >=
Format([period beginning "mm/dd/yyyy"], "short date")
AND [plan revenue expense].[checkdt] <=
Format([periond ending "mm/dd/yyyy"], "short date") ))
AS ExpsToCount
ON [ExpsToCount].[counted sp] = [support provider].[id]
WHERE [support provider].[inactive?] = false
AND ( [support provider].[de?] = true
OR [support provider].[ic?] = true )
GROUP BY [support provider].[sp last],
[support provider].[sp first],
[support provider].[sp mi],
[support provider].[agency],
[support provider].[de?],
[support provider].[ic?],
[support provider].[agency?],
[support provider].[generalbus?],
[ExpsToCount].[counted svc]
ORDER BY [ExpsToCount].[counted svc],
[support provider].[agency],
[support provider].[sp last],
[support provider].[sp first],
[support provider].[sp mi],
[ExpsToCount].[counted svc];
[IC?], [DE?], [Agency?], [GeneralBus?]
サポート プロバイダーのタイプを示す単なるブール フィールドです。繰り返しますが、なぜデータベース担当者は、外部キーを持つ単一のフィールドではなく、これを選択したので、あなたは 1 つのタイプのプロバイダーにしかなれなかったのでしょうか?
そのため、現在もサブクエリを使用しています。
しかし、費用が関連付けられていないサービス コードにゼロが返されるわけではありません。それは私に実際の費用のカウントを与えるだけです.0を気にしなければ問題ありません.私自身の啓発のためだけに.
私はこのことを最後の日かそこらで回っているように感じます、そして私の脳は友達です. 2 番目の目が必要です。
[Support Provider] と [Z Service Codes New] をクロス結合して、考えられるすべてのマッチアップを取得し、関連する経費レコードがない場合は 0 を、経費がある場合は COUNT を選択的に指定する必要があると思います。記録。しかし、いずれにしても、サポート プロバイダーごとに 1 つのサービス コードが必要です。
Access で CROSS JOIN を INNER JOIN または OUTER JOIN と組み合わせるための構文がわかりませんか? そして、私の目的にとって最良の組み合わせは何でしょうか。どういうわけかサブクエリなしで逃げることはできますか、それともまだ必要ですか? CROSS JOIN と比較して、これを完全に行うためのより良い方法はありますか? (CROSS JOIN が設計されたのはそのようなものだと思います...しかし、私は間違っている可能性がありますか?)
すべてが理にかなっていることを願っています。考え?ああ、私は Access 2003 Professional SP3 を使用しています。
編集:
さて、私自身のエレガントな解決策 (まあ、それがエレガントかどうかはわかりませんが、うまくいきます!) は、メインの FROM 行で 2 つのカスタム SELECT ステートメントを作成し、2 つの一致基準に基づいて 2 つの SELECT ステートメントを結合することです。 :
SELECT [ProvidersXCodes].[SP Last], [ProvidersXCodes].[SP First], [ProvidersXCodes].[SP MI], [ProvidersXCodes].[Agency], [ProvidersXCodes].[SvcCode], IIf(COUNT([ExpsToCount].[ExpCountID])=0,0,COUNT([ExpsToCount].[ExpCountID])) AS [Exp Count]
FROM (SELECT [Support Provider].[ID] AS [CodeProvider], [Support Provider].[SP Last], [Support Provider].[SP First], [Support Provider].[SP MI], [Support Provider].[Agency], [Z Service Codes New].[Service Code] AS [SvcCode]
FROM [Support Provider], [Z Service Codes New]
WHERE [Support Provider].[Inactive?]=FALSE
AND ([Support Provider].[DE?]=TRUE OR [Support Provider].[IC?]=TRUE)
AND NOT ([Z Service Codes New].[Service Code] LIKE '111*'
OR [Z Service Codes New].[Service Code] LIKE '222*'
OR [Z Service Codes New].[Service Code] LIKE '333*')
GROUP BY [Support Provider].[ID], [Support Provider].[SP Last], [Support Provider].[SP First], [Support Provider].[SP MI], [Support Provider].[Agency], [Z Service Codes New].[Service Code]) AS [ProvidersXCodes]
LEFT JOIN (SELECT [Support Provider].[ID] AS [ExpCountProv], [Plan Revenue].[Service] AS [ExpCountSvc], [Plan Revenue Expense].[Exp ID] AS [ExpCountID]
FROM [Plan Revenue], [Plan Revenue Expense], [Support Provider]
WHERE [Plan Revenue].[Rev ID]=[Plan Revenue Expense].[RevID]
AND [Plan Revenue Expense].[SP]=[Support Provider].[ID]
AND [Support Provider].[Inactive?]=FALSE
AND ([Support Provider].[DE?]=TRUE OR [Support Provider].[IC?]=TRUE)
AND ([Plan Revenue Expense].[CheckDt]>=Format([Period Beginning "MM/DD/YYYY"],"Short Date") AND [Plan Revenue Expense].[CheckDt]<=Format([Periond Ending "MM/DD/YYYY"],"Short Date"))
GROUP BY [Support Provider].[ID], [Plan Revenue].[Service], [Plan Revenue Expense].[Exp ID]) AS [ExpsToCount] ON ([ProvidersXCodes].[CodeProvider]=[ExpsToCount].[ExpCountProv] AND [ProvidersXCodes].[SvcCode]=[ExpsToCount].[ExpCountSvc])
GROUP BY [ProvidersXCodes].[SP Last], [ProvidersXCodes].[SP First], [ProvidersXCodes].[SP MI], [ProvidersXCodes].[Agency], [ProvidersXCodes].[SvcCode]
ORDER BY [ProvidersXCodes].[SvcCode], [ProvidersXCodes].[Agency], [ProvidersXCodes].[SP Last], [ProvidersXCodes].[SP First], [ProvidersXCodes].[SP MI];
問題が解決しました!
問題を言語化する必要があることは、実際の問題が何であるか、クロス積にする必要がある特定の情報と、より標準的な結合操作にする必要がある情報を自分で検討するようになったため、解決策にたどり着くのに役立ったと思います2つのセットを適切にリンクする方法...
〜MG(私)