0

MS Access には、クエリを使用して日付範囲内のデータを表示するレポートがいくつかあります。クエリはエイリアス、if、sum、および avg 関数を使用し、複数のテーブルを結合してそのデータを取得します。

誰かが新しいものと年。

「古い」クエリの例を次に示します。

SELECT tblAssessment.fldValid, tblATraining.fldTID, tblATraining.fldTCrsID, 
tblCourses.fldCrsName, [fldCrsHrs]/8 AS Days, tblATraining.fldTLocAbr, 
tblDistrict.fldDistAbr, tblRegion.fldRegName, tblATraining.fldTDateStart, 
tblATraining.fldTDateEnd, tblATraining.fldTEnrolled, tblATraining.fldTPID, 
tblPersonnel.fldPName, tblAssessment.fldTrngSID, tblAssessment.Q1, 
IIf([fldValid]=True,IIf([Q1]>0,1,0),0) AS Q1Valid, tblAssessment.Q2, 
IIf([fldValid]=True,IIf([Q2]>0,1,0),0) AS Q2Valid, tblAssessment.Q3, 
IIf([fldValid]=True,IIf([Q3]>0,1,0),0) AS Q3Valid, tblAssessment.Q4, 
IIf([fldValid]=True,IIf([Q4]>0,1,0),0) AS Q4Valid, tblAssessment.Q5, 
IIf([fldValid]=True,IIf([Q5]>0,1,0),0) AS Q5Valid, tblAssessment.Q6, 
IIf([fldValid]=True,IIf([Q6]>0,1,0),0) AS Q6Valid, tblAssessment.Q7, 
IIf([fldValid]=True,IIf([Q7]>0,1,0),0) AS Q7Valid, tblAssessment.Q8, 
tblAssessment.Q9, 
IIf([fldValid]=True,IIf([Q9]>0,1,0),0) AS Q9Valid, tblAssessment.Q10, 
IIf([fldValid]=True,IIf([Q10]>0,1,0),0) AS Q10Valid, tblAssessment.Q11, 
IIf([fldValid]=True,IIf([Q11]>0,1,0),0) AS Q11Valid, tblAssessment.Q12, 
IIf([fldValid]=True,IIf([Q12]>0,1,0),0) AS Q12Valid, tblAssessment.Q13, 
tblAssessment.Q14, 
IIf([fldValid]=True,IIf([Q14]>0,1,0),0) AS Q14Valid, tblAssessment.Q15, 
IIf([fldValid]=True,IIf([Q15]>0,1,0),0) AS Q15Valid, tblAssessment.Q16, 
IIf([fldValid]=True,IIf([Q16]>0,1,0),0) AS Q16Valid, tblAssessment.Q17, 
IIf([fldValid]=True,IIf([Q17]>0,1,0),0) AS Q17Valid, tblAssessment.Q18, 
IIf([fldValid]=True,IIf([Q18]>0,1,0),0) AS Q18Valid, tblAssessment.Q19, 
IIf([fldValid]=True,IIf([Q19]>0,1,0),0) AS Q19Valid, tblAssessment.Q20, 
tblAssessment.Q21, 
IIf([fldValid]=True,IIf([Q21]>0,1,0),0) AS Q21Valid, tblAssessment.Q22, 
IIf([fldValid]=True,IIf([Q22]>0,1,0),0) AS Q22Valid, tblAssessment.Q23, 
IIf([fldValid]=True,IIf([Q23]>0,1,0),0) AS Q23Valid, tblAssessment.Q24, 
IIf([fldValid]=True,IIf([Q24]>0,1,0),0) AS Q24Valid, tblAssessment.Q25, 
IIf([fldValid]=True,IIf([Q25]>0,1,0),0) AS Q25Valid, tblAssessment.Q26, 
IIf([fldValid]=True,IIf([Q26]>0,1,0),0) AS Q26Valid, tblAssessment.Q27, 
IIf([fldValid]=True,IIf([Q27]>0,1,0),0) AS Q27Valid, tblAssessment.Q28, 
IIf([fldValid]=True,IIf([Q28]>0,1,0),0) AS Q28Valid, tblAssessment.Q29, 
tblAssessment.Q30, 
tblAssessment.Q31, tblAssessment.Q32
FROM ((tblDistrict 
       LEFT JOIN tblRegion ON tblDistrict.fldDRegID = tblRegion.fldRegID) 
       RIGHT JOIN (((tblATraining 
                     LEFT JOIN tblCourses ON tblATraining.fldTCrsID = tblCourses.fldCrsID) 
                   LEFT JOIN tblPersonnel ON tblATraining.fldTPID = tblPersonnel.fldPID) 
                  LEFT JOIN tblLocations ON tblATraining.fldTLocAbr = tblLocations.fldLID) ON tblDistrict.fldDistAbr = tblATraining.fldTDistAbr) 
     LEFT JOIN tblAssessment ON tblATraining.fldTID = tblAssessment.fldTrngCID
WHERE (((tblAssessment.fldValid)=True) 
        AND ((tblATraining.fldTCrsID) Like [forms]![fdlgRptCriteria].[selCrsCd]) 
        AND ((tblATraining.fldTDateStart) Between [forms]![fdlgRptCriteria].[seldate1] And [forms]![fdlgRptCriteria].[seldate2]) 
        AND ((tblAssessment.fldTrngSID) Is Not Null));
4

4 に答える 4

2

はい。ただし、ユニオン用に新しいクエリ定義を作成することを検討してください。

(前回確認した SQL デザイン ウィンドウを使用する必要があります。)

おおよそ次のようになります。

    SELECT
    tblATraining.fldTID,
    tblATraining.fldTCrsID,
    tblATraining.fldTLocAbr,
    tblATraining.fldTDateStart,
    tblATraining.fldTDateStart,
    tblATraining.fldTDateEnd,
    tblATraining.fldTEnrolled,
    tblATraining.fldTPID

    UNION ALL

    tblATrainingArchive.fldTID,
    tblATrainingArchive.fldTCrsID,
    tblATrainingArchive.fldTLocAbr,
    tblATrainingArchive.fldTDateStart,
    tblATrainingArchive.fldTDateStart,
    tblATrainingArchive.fldTDateEnd,
    tblATrainingArchive.fldTEnrolled,
    tblATrainingArchive.fldTPID

tblATrainingUnion のような名前を付けます。

次に、tblATraining がある場所ならどこでも、それを既存のクエリにプラグインします。

注: また、多くの人は、アーカイブ テーブルを実際に意味をなすよりも早く作成する傾向があります。すべてをメイン テーブルに残して、実際に違いを測定できるようになったら分割することを検討することもできます。(すでにその点に到達し、それを実行している可能性があります。たとえば、SQL Server よりも Access の方が理にかなっている可能性があります。)

于 2009-06-15T16:22:00.640 に答える
2

はい、Access は をサポートしていますUNION ALL。簡単な例は次のとおりです。

select foo from OldData
union all
select foo from NewData
于 2009-06-15T16:11:47.313 に答える
1

アーカイブに関する @le dorfier のコメントを強調します。Jet データ ストアを使用するほとんどの Access アプリケーションでは、データをアーカイブする必要はありません。私のクライアントは、私が 1997 年から 1998 年に彼女のために構築した 6 つの駐車場の課金システムを実行しています (それ以来、大幅にアップグレード、拡張、改訂されています)。その期間全体のデータ (各ガレージの毎月 200 ~ 300 件の請求書) が含まれており、現在も当時と同じように高速に動作します。その一部は、PC のパフォーマンスの向上です (つまり、同じ量のデータと 1997 年代の PC では、おそらく非常に遅くなるでしょう) が、それでも問題なく動作します。

速度が問題になり始めた場合は、おそらくバックエンドを SQL Server Express に移行するでしょう。私たちが最後に考えることは、データのアーカイブです。

私の別のクライアントは、非アクティブなデータをアーカイブすることを主張したため、ADD NEW RECORD 機能を再プログラムして、アーカイブをチェックする必要がありました (アプリの要件のため、同じ人物が新しいレコードを作成しないことが重要ですが、代わりに、アーカイブから取得します)。これにより、新しいレコードを追加するプロセスが大幅に遅くなりました。現在、私は彼らにデータを「デアーカイブ」するよう説得しようとしています。なぜなら、それは実際には何の役にも立たず、日常業務の動作が遅くなったからです。

于 2009-06-15T23:50:21.207 に答える
0

あなたの質問に関係のない2つのコメント。

1) Q1 から Q32 のフィールドの目的は何ですか? おそらく、それらは何らかの形で再設計および/または正規化される可能性があると考えています.

2) オブジェクト名に命名基準を使用する理由がわかりません。tbl、fld、frm、qry など。コード内のコンテキストによって、それらがどのような種類のオブジェクトであるかがほとんどわかります。さまざまなデータベース コンテナー ウィンドウの場合、それらもかなり明白です。

とは言っても、VBA コードで変数の命名規則を多少使用して、それらを明確に保つようにしています。

詳細については、 Tony's Object Naming ConventionsおよびTony's Table and Field Naming Conventionsを参照してください。

私の 2 番目のコメントに激しく反対し、私の投稿を低評価する人もいると思います。

于 2009-06-16T09:39:34.310 に答える