2011-06-24 15 views
3

私は診療所のAccess 2003データベースの管理を引き継いだ。残念なことに、DBを作成した人はデータベースについてあまり知りませんでしたし、すべてを1つのHUGEテーブルに投げました。だから私は、以下のフィールド(および約40の他のフィールド)を持つAll Clinic Dataというテーブルを持っています:PatientID, First Name, Last Name, Appt Date, OB at Appt, Billing Item #1, Second Appt Date, Reason for Second Appt, OB at Second Appt, Billing Item #2.MS Access指定した日付範囲に基づいてクエリフィールドを選択

これはデータを整理する最適な方法ではないと私は知っています。未来。しかし、今は、特定の日付範囲で発生した予定の情報のみを含むレポートを作成する必要があります。

これは、現在レポートを入力するために使用しているSQLクエリですが、そのうちの1つが指定された日付範囲内にある場合は、そのテーブルの患者のすべての予定をキャプチャします。

SELECT 
    Format([Input start date],"mm/dd/yy") & " through " & Format([Input end date],"mm/dd/yy") AS Expr1, 
    [All Clinic Data].[PatientID], [All Clinic Data].[Last Name], 
    [All Clinic Data].[First Name], [All Clinic Data].[Appt Date], 
    [All Clinic Data].[OB at Appt], [All Clinic Data].[Billing Item #1], 
    [All Clinic Data].[Second Appt Date], [All Clinic Data].[Reason for Second Appt], 
    [All Clinic Data].[OB at Second Appt], [All Clinic Data].[Billing Item #2] 
FROM [All Clinic Data] 
WHERE (
     (([All Clinic Data].[Appt Date])>[Input start date] And 
     ([All Clinic Data].[Appt Date])<[Input end date]) 
    ) 
    OR 
    (
     (([All Clinic Data].[Second Appt Date])>[Input start date] And 
     ([All Clinic Data].[Second Appt Date])<[Input end date]) 
    ) 
ORDER BY [All Clinic Data].[Last Name]; 

メモ入力開始日&入力終了日クエリの実行時にパラメータが入力されます。 私はIIFを使用して余分なデータを削除しようとしましたが、予定日と関連付けられたデータ(OBと請求明細)のみが指定された日付範囲内に表示されるように文を構造化する方法はわかりません。

例:

1, Sally, Jones, 1/04/2010, Dr.A, 2/05/2011, Dr. B, Flu 

2, Jennifer, Baker, 7/05/2010, Dr.X, 15/05/2011, Dr. B, Checkup 

3, Joe, Smith, 20/06/2010, Dr.S, 

4, Tina, Turner, 17/05/2010, Dr.X, 15/06/2011, Dr. B, Checkup 

[入力開始日] = 2010年5月1日と[入力終了日] = 2010年5月31日

場合、私は私のレポートが含まれているしたいと思います:

Sally, Jones, 

1. 2/05/2011, Dr. B, Flu 

Jennifer, Baker, 

1. 7/05/2010, Dr.X 
2. 15/05/2011, Dr.B, Checkup 

Tina, Turner, 

1. 17/05/2010, Dr.X 

これが十分な情報であることを希望します。ご協力ありがとうございました。

更新日1 マイクが以下に示唆したことを試してみるための最初のステップです。私は後でつかむ患者情報の識別子としてphnを使用しています。私はコンパイルエラーが発生していると私は間違って何をしたのか知るために洗練されていません。何か案は?

SELECT 
    Format([Input start date],"mm/dd/yy") & " through " & Format([Input end  date],"mm/dd/yy") AS Expr1, 
    [All Clinic Data].PHN AS Phn, [All Clinic Data].[Appt Date] AS Date, 
    [All Clinic Data].[OB at Appt] AS OBName, 
    [All Clinic Data].[Billing Item #1] AS Billing 
FROM [All Clinic Data] 

WHERE ([All Clinic Data].[Appt Date]>[Input start date] And [All Clinic Data].[Appt Date]<[Input end date]) 

UNION 

SELECT 
    Format([Input start date],"mm/dd/yy") & " through " & Format([Input end date],"mm/dd/yy") AS Expr1, 
    [All Clinic Data].PHN AS Phn, [All Clinic Data].[Second Appt Date] AS Date, 
    [All Clinic Data].[OB at Second App] AS OBName, 
    [All Clinic Data].[Billing Item #2] AS Billing FROM [All Clinic Data] 

WHERE ([All Clinic Data].[Second Appt Date]>[Input start date] And [All Clinic Data].[Second Appt Date]<[Input end date]); 
+0

MM/DD/YYYYとMM/DD/YYYYの間のアポイントを要求しますが、データはDD/MM/YYYYとして格納されているようです。それを確認できますか? – mikeY

+0

はい、私のデータはDD/MM/YYYYとして保存されています。私の報告書では、MM/DD/YYと書式を設定しています。私は入力パラメータを長い手で入力しましたが、私はAccessがそれをDD/MM/YYYYに変換することができるので、比較を行うことができます。 – Crystal

+0

私はそれを見て、今すぐテストコードを歩く時間がありませんが、これは私が見ているアプローチだと思う:1.あなたが望むすべての最初の予定情報を選択するためのクエリを作成します。 2.すべての2番目の予定情報を選択するためのクエリを作成します。 3.それらの2つを組合わせて、それから選択します。作業にはグループ化の問題があります。 HTH。 – mikeY

答えて

1

PatientAppointmentと呼ばれるクエリを作成します。

SELECT 
    D.PatientID, 
    D.[Appt Date] AS ApptDate, 
    D.[OB at Appt] AS OBName 
    D.[Billing Item #1] AS Billing 
UNION ALL SELECT 
    D.PatientID, 
    D.[Second Appt Date], 
    D.[OB at Second Appt], 
    D.[Billing Item #2]; 

をこのクエリは、デザイナーで編集することはできませんのでご注意ください。 SQLビューでのみ操作できます。次に、このデータ上のすべてのクエリのためのあなたの源として、このクエリを使用します。

SELECT * 
FROM 
    PatientAppointment PA 
WHERE 
    PA.ApptDate >= [Input start date] 
    AND PA.ApptDate < [Input end date]; 

私はパフォーマンスがものになるかどうかわかりませんが、あなたはそれを試してみて、私たちに知らせることができます。基本的には、これをあなたの予定表として扱い、メインテーブルのこれらの列についても対処しないでください。これは、最終的には実際のテーブルにしてデータを移行できるため、アプリケーションの変更をゆっくり開始する方法です。

となる可能性があります。となる可能性があります。または悪い:

テーブルに1つの列と行を作成します。テーブルや行の名前が何であるかは関係ありませんが、データ型は数値Longにしてください。私はこのテーブルの名前をDualとします。その後、同じPatientAppointmentクエリします:あなたは、「SQL 92構文」をお持ちの場合

SELECT 
    D.PatientID, 
    Iif(A.ApptNum = 1, D.[Appt Date], D.[Second Appt Date]) ApptDate, 
    Iif(A.ApptNum = 1, D.[OB at Appt], D.[OB at Second Appt]) OBName, 
    Iif(A.ApptNum = 1, D.[Billing Item #1], D.[Billing Item #2]) Billing 
FROM 
    [All Clinic Data] D 
    INNER JOIN [ 
     SELECT 1 AS ApptNum FROM Dual 
     UNION ALL SELECT 2 FROM Dual 
    ]. A ON 1 = 1 

私に知らせて、私はこの最後のクエリでより良い構文に切り替えるよ、あなたのデータベースに投入。

また、UNION SELECTに対しては、重複を排除するためにエンジンがより多く働くため、お勧めします(UNION SELECTをお勧めします)。UNION ALL SELECTメソッドを使用することもできます。私はすぐにあなたのクエリに間違って何かを見ることはできません、それぞれ別のSELECT文を単独で問題があるかどうかを試してみてください。

最後に、これらの方法のいずれかのパフォーマンスがひどい場合、指定したクエリでDualというクエリとハイブリッドを組み合わせることができます。大きなOR条件で示したようにクエリを実行しますが、上記のDualクエリのように、2つの予定を別々の行に分割します。正しい日付範囲と一致しない行を抑制する条件を追加すると便利です(他の予定が行ったため)。

関連する問題