アプリ版:「スタンプのみでお礼する」機能のリリースについて

アクセス2000でデータベースを作っています。毎日データを入力しているのですが、グラフを作成するにあたって、各月の最後のデータのみをグラフに反映したいと考えています(9月であれば30日のデータ)。このような抽出が出来る方法を教えていただけないでしょうか。

A 回答 (9件)

#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.最終日;
    • good
    • 0
この回答へのお礼

丁寧な回答有難うございました。早速、試してみたいと思います。

お礼日時:2010/09/30 20:30

>例えば、9月27日が9月の最終データ



これをクエリでやるには、
基になるデータから、クロス集計クエリで、
縦軸に基のデータの年月、集計列に日の最大、横軸に基のデータの日、とする。
これの「年月」「日の最大」から、グラフ出力対象の日が求まります。

仮に、その月が「01」日の分しかなかったら「01」。
1月だから・・・31、2月だから・・・29、ではないです。
発生データ内での月単位の末日を出せます。
ただし、まったくデータのない月は考慮が必要です。

これと前述の考えとの組合わせで良いです。
    • good
    • 0
この回答へのお礼

度々の回答有難うございます。早速試してみたいと思います。助かりました。

お礼日時:2010/09/30 20:32

結合した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文を使ってください。
    • good
    • 0

#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.日付の最大;

のようになります。
    • good
    • 0

日付があるフィールドを「日付」とします。


以下で月の最終日が取れます。

SELECT Max(Temp.日付) AS 日付の最大
FROM テーブル1 AS Temp
GROUP BY Format(Temp.日付,"yy/mm");

月末ではないということなのでこれで
どうでしょう。
    • good
    • 0

月末日だけを抜き出したい時は少しだけ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 などは考慮してません。
    • good
    • 0
この回答へのお礼

回答有難うございます。なるほど、VBAにより、+1日が1であるかで判別することで、月末データのみ抽出できますね。ただ、質問時の説明が悪かったのですが、月末日のデータが無い月もあります。例えば、9月27日が9月の最終データという場合があります。従って、正確に言うと、月末日のデータを抽出というよりも、月の最後のデータを抽出したいというのが、ゴールイメージです。また、いい知恵がありましたら教えていただけると助かります。

お礼日時:2010/09/28 16:32

>9月であれば30日


必ず月末日データが発生するのであれば、
その年単位で12個(1/31、2/28、3/31、・・・)のレコードを別途作っておく、
でもいいのではないでしょうか。月末日テーブル。

クエリを使えば、基になるデータが1か月分あっても1年分あっても
作った月末日テーブルの日付で結合させれば12個の日付指定した分だけ抽出できるかと
思います。

さらに、12個のレコードと出力対象有無のフラグもつければ
8月と9月(の月末日)だけでグラフ作成、も可能になりそうです。
    • good
    • 0
この回答へのお礼

回答有難うございます。なるほど、月末日のテーブルを別途作成し、結合させれば月末データのみ抽出できますね。質問時の説明が悪かったのですが、月末日のデータが無い月もあります。例えば、9月27日が9月の最終データという場合があります。従って、正確に言うと、月末日のデータを抽出というよりも、月の最後のデータを抽出したいというのが、ゴールイメージです。また、いい知恵がありましたら教えていただけると助かります。

お礼日時:2010/09/28 16:30

特定の月だけなら色々な方法があるけど、2ヶ月以上のデータから


抜き出すとなると面倒そうですね。
> 月末日のデータ用テーブルを日毎のデータと別で作成するという
> ことでしょうか?
そうじゃないのかな?月末日だけの日付テーブルを作って連結するとか。

> 日毎のデータから、クエリで表を作る方法があるのでしょうか?
クエリで1発じゃなくて、VBA で2010年1月の月末、2010年2月の月末、、、
とループを回して該当データを抜き出すような方法しか思い浮かばないです。

月で集約して日の最大値と一致する自己との連結で。。。できるのかな^^;
    • good
    • 0

いろんなやり方があるのかもしれませんが、横着せずに、月末日だけの表を作るのが堅実かもしれませんね。

この回答への補足

早速の回答有難うございます。質問なのですが、月末日だけの表をつくるというのは、月末日のデータ用テーブルを日毎のデータと別で作成するということでしょうか?それとも、日毎のデータから、クエリで表を作る方法があるのでしょうか?

補足日時:2010/09/27 15:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!