- 締切済み
アクセス2000でデータベースを作っています。毎日データを入力している
アクセス2000でデータベースを作っています。毎日データを入力しているのですが、グラフを作成するにあたって、各月の最後のデータのみをグラフに反映したいと考えています(9月であれば30日のデータ)。このような抽出が出来る方法を教えていただけないでしょうか。
- みんなの回答 (9)
- 専門家の回答
みんなの回答
- piroin654
- ベストアンサー率75% (692/917)
#7です。回答が分散し、#5、#6、#7の中で分かりづらい表現が あったので、一つにまとめ、表現を変更しておきます。実行結果は同じです。 (1) 日付があるフィールドを「日付」とします。 以下で月の最終日が取れます。クエリの 名前を「Q最終日」とします。 SELECT Max(Temp.日付) AS 最終日 FROM テーブル1 AS Temp GROUP BY Format(Temp.日付,"yy/mm"); (2) Q最終日とテーブルとの組み合わせで最終日のデータを 取り出すクエリ。テーブル1とテーブルのフィールドを 項目1、項目2とします。フィールド数は必要に応じて 増やしたり減らしたりしてください。 SELECT テーブル1.日付, テーブル1.項目1, テーブル1.項目2 FROM テーブル1 INNER JOIN Q最終日 ON テーブル1.日付 = Q最終日.最終日; (3) 一つのクエリで最終日と最終日のデータを取り出すクエリ。 (1)と(2)の合成です。質問と補足の内容にはこれでいいでしょう。 (2)と同様に、必要に応じてフィールド数は減らしたり増やし たりしてください。 SELECT テーブル1.日付, テーブル1.項目1, テーブル1.項目2 FROM テーブル1 INNER JOIN (SELECT Max(Temp.日付) AS 最終日 FROM テーブル1 AS Temp GROUP BY Format(Temp.日付,"yy/mm")) AS T1 ON テーブル1.日付 = T1.最終日;
- layy
- ベストアンサー率23% (292/1222)
>例えば、9月27日が9月の最終データ これをクエリでやるには、 基になるデータから、クロス集計クエリで、 縦軸に基のデータの年月、集計列に日の最大、横軸に基のデータの日、とする。 これの「年月」「日の最大」から、グラフ出力対象の日が求まります。 仮に、その月が「01」日の分しかなかったら「01」。 1月だから・・・31、2月だから・・・29、ではないです。 発生データ内での月単位の末日を出せます。 ただし、まったくデータのない月は考慮が必要です。 これと前述の考えとの組合わせで良いです。
お礼
度々の回答有難うございます。早速試してみたいと思います。助かりました。
- piroin654
- ベストアンサー率75% (692/917)
結合したSQL文が少し変更されていたので、 以下で張り付けてください。 SELECT テーブル1.日付, テーブル1.項目1, テーブル1.項目2 FROM テーブル1 INNER JOIN (SELECT Max(Temp.日付) AS 日付の最大 FROM テーブル1 AS Temp GROUP BY Format(Temp.日付,"yy/mm")) AS T1 ON テーブル1.日付 = T1.日付の最大; Accessはサブクエリを読み込んで一旦デザインビューで 保存すると、場合によっては変な変更をするので#6の 結合したSQL文をそのまま張り付けて実行するとエラーが 出る可能性があるので上記のSQL文を使ってください。
- piroin654
- ベストアンサー率75% (692/917)
#5です。なお、必要なフィールドを追加する場合は、 #5を応用して、フィールドを項目1、項目2とすると、 #5のクエリをQ最終日とすると、 SELECT テーブル1.日付, テーブル1.項目1, テーブル1.項目2 FROM テーブル1 INNER JOIN Q最終日 ON テーブル1.日付 = Q最終日.日付の最大; あるいは、すべて結合して、 SELECT テーブル1.日付, テーブル1.項目1, テーブル1.項目2 FROM テーブル1 INNER JOIN [SELECT Max(Temp.日付) AS 日付の最大 FROM テーブル1 AS Temp GROUP BY Format(Temp.日付,"yy/mm")]. AS T1 ON テーブル1.日付 = T1.日付の最大; のようになります。
- piroin654
- ベストアンサー率75% (692/917)
日付があるフィールドを「日付」とします。 以下で月の最終日が取れます。 SELECT Max(Temp.日付) AS 日付の最大 FROM テーブル1 AS Temp GROUP BY Format(Temp.日付,"yy/mm"); 月末ではないということなのでこれで どうでしょう。
- nicotinism
- ベストアンサー率70% (1019/1452)
月末日だけを抜き出したい時は少しだけVBAの世話になります。 (または、構造の同じ新規テーブルを作成し、月末だけを選んで手動コピペ) Alt + F11 を押してVBE(visual basic editor)の画面を出します。 メニューから、挿入→標準モジュールと選んでゆくと新たなウィンドウが出ますので 下記をコピペ Function FncIsGetumatu(ByVal sDay As Date) As Boolean FncIsGetumatu = Day(sDay + 1) = 1 End Function 終わったらメニューのデバッグから、○▽のデバッグがありますので選択 (○▽はそちらの状況によって変わります) エラーが出なかったら、Alt + F4 で閉じます。 次に、新たなクエリーを作成します。 そちらのグラフで使うフィールドに合わせて作ってください。 で、多分、日付のデータが入っているフィールドがあると思いますので 名前が仮に、『日付』だったとします。 この『日付』の抽出欄に、 fncisgetumatu([日付])=True として、データシートビューに切り替えてみてください。 お望みのものが出てくる(かも)と思います。 この関数は、ある日(sDay)の次の日(+1)が一日(=1)であるかどうかで判断しています。 なお、ありえない日にち、2010/9/31 や 2010/2/29 などは考慮してません。
お礼
回答有難うございます。なるほど、VBAにより、+1日が1であるかで判別することで、月末データのみ抽出できますね。ただ、質問時の説明が悪かったのですが、月末日のデータが無い月もあります。例えば、9月27日が9月の最終データという場合があります。従って、正確に言うと、月末日のデータを抽出というよりも、月の最後のデータを抽出したいというのが、ゴールイメージです。また、いい知恵がありましたら教えていただけると助かります。
- layy
- ベストアンサー率23% (292/1222)
>9月であれば30日 必ず月末日データが発生するのであれば、 その年単位で12個(1/31、2/28、3/31、・・・)のレコードを別途作っておく、 でもいいのではないでしょうか。月末日テーブル。 クエリを使えば、基になるデータが1か月分あっても1年分あっても 作った月末日テーブルの日付で結合させれば12個の日付指定した分だけ抽出できるかと 思います。 さらに、12個のレコードと出力対象有無のフラグもつければ 8月と9月(の月末日)だけでグラフ作成、も可能になりそうです。
お礼
回答有難うございます。なるほど、月末日のテーブルを別途作成し、結合させれば月末データのみ抽出できますね。質問時の説明が悪かったのですが、月末日のデータが無い月もあります。例えば、9月27日が9月の最終データという場合があります。従って、正確に言うと、月末日のデータを抽出というよりも、月の最後のデータを抽出したいというのが、ゴールイメージです。また、いい知恵がありましたら教えていただけると助かります。
- MARU4812
- ベストアンサー率43% (196/452)
特定の月だけなら色々な方法があるけど、2ヶ月以上のデータから 抜き出すとなると面倒そうですね。 > 月末日のデータ用テーブルを日毎のデータと別で作成するという > ことでしょうか? そうじゃないのかな?月末日だけの日付テーブルを作って連結するとか。 > 日毎のデータから、クエリで表を作る方法があるのでしょうか? クエリで1発じゃなくて、VBA で2010年1月の月末、2010年2月の月末、、、 とループを回して該当データを抜き出すような方法しか思い浮かばないです。 月で集約して日の最大値と一致する自己との連結で。。。できるのかな^^;
- nattocurry
- ベストアンサー率31% (587/1853)
いろんなやり方があるのかもしれませんが、横着せずに、月末日だけの表を作るのが堅実かもしれませんね。
補足
早速の回答有難うございます。質問なのですが、月末日だけの表をつくるというのは、月末日のデータ用テーブルを日毎のデータと別で作成するということでしょうか?それとも、日毎のデータから、クエリで表を作る方法があるのでしょうか?
お礼
丁寧な回答有難うございました。早速、試してみたいと思います。