柔軟に働き方を選ぶ時代に必要なこと >>

会社コード、品目コード、月度、出荷数の入った明細テーブルがあります
これを過去3ヶ月で出荷数を移動平均したいのです

例 元データ
会社コード、品目コード、月度、出荷数
A00000001,AAAAAAA,201410,10
A00000001,AAAAAAA,201410,10
A00000001,AAAAAAA,201408,10
B00000002,BBBBBBB,201408,10

出力したい値
会社コード、品目コード、月度、出荷数
A00000001,AAAAAAA,201410,10←出荷数は同じ会社コード、品目コードの(10月+9月+8月)÷3)
A00000001,AAAAAAA,201409,3.33←出荷数は同じ会社コード、品目コードの(9月+8月+7月)÷3)
A00000001,AAAAAAA,201408,3.33←出荷数は同じ会社コード、品目コードの(8月+7月+6月)÷3)
B00000002,BBBBBBB,201408,3.33←出荷数は同じ会社コード、品目コードの(8月+7月+6月)÷3)

このような事がしたいのですがどのようにしたら実現できるでしょうか
月度で移動平均なんて良く使いそうな気がしますが・・簡単なようで難しく悩んでおります
どうかよろしくお願い致します

このQ&Aに関連する最新のQ&A

A 回答 (17件中1~10件)

>その計算の元ネタとなる過去3ヶ月間の移動平均出荷数が求めたかったのです。



私の最終回答で、出荷数=0の月も含めて求められていると思いますよ。

7月---10
8月---10
9月---0 ----->(10+10+0)/3・・・(7月+8月+9月)/3
10月--10 ---->(10+0+10)/3・・・(8月+9月+10月)/3
11月--10 ---->(0+10+10)/3・・・(9月+10月+11月)/3

添付図では、このように計算しています。こういう計算結果を9月にも出力するには、9月にも出荷数=0の行も必要。その為に、ユニオンクエリで求めた出荷数=0を全ての月に加えています。

1、ユニオンクエリーで集荷数=0を全ての組み合わせを全ての月に追加してもDistinct句を使えば出力では重複することはありません。

2、ユニオンクエリーで集荷数=0を全ての組み合わせを全ての月に追加しても、移動平均出荷数の計算結果は同じです。10+0=10ですから。

添付図の結果は、[会社コード], [品目コード], [月度],[集荷数]=0を追加した後に、次のSQL文を実行したもの。

SELECT DISTINCT [会社コード], [品目コード], [月度], Format(Rounds(DSum("出荷数", "出荷履歴", WHERE 会社コード='" & [会社コード] & "' AND 品目コード='" & [品目コード] & "' AND 月度 BETWEEN ' MoveMonth([月度],-3) & "' AND '" & [月度] & "'")/3,0,2),"0.00") AS 平均出荷数
FROM 出荷履歴
WHERE 月度 BETWEEN "201408" AND "201410"
ORDER BY [会社コード], [品目コード], [月度];

動かないとすれば、単なる転記ミスです。

1、DISTINCT句を使っていること。
  これで、ダミー行を出力から追放することができます。
2、表示する期間を指定していること。
  表示する期間は、まあ、実際に運用する際に全期間の結果を求めないだろうと考えたからに過ぎません。

なお、MoveMonth([月度],-3) でBETWENNを簡略化、あるいはRounds()で四捨五入していること。これらは、枝葉の問題。

要は、[会社コード], [品目コード], [月度],[集荷数]=0を追加すればよいだけと思いますが・・・。
    • good
    • 0
この回答へのお礼

ありがとうございます

>>1、ユニオンクエリーで集荷数=0を全ての組み合わせを全ての月に追加してもDistinct句を使えば出力では重複することはありません

この考え方は目からうろこです
そうですね、足りない月のレコードだけを追加する事にこだわって難しく考えていたかもしれません
全部の月に対して出荷数0のレコードを追加した後で
select 会社コード、品目コード、sum(出荷数) from hoge group by 会社コード、品目コード

グルーピングしてあげればもともとレコードのない月は出荷数0のレコードとして出力されますね

お礼日時:2014/10/25 12:52

【疑問】今のアプローチは正しいのか?



>毎月の在庫回転期間を求めたいのです。

商品名|月次出庫数|月次期首在庫|月次期末在庫|月次在庫回転率|月次在庫回転期間
AA1|__100|___100|_____0|__2.000|___0.5ヶ月
AA2|___50|___100|____50|__0.666|___1.5ヶ月
AA3|____0|___100|___100|__0.000|________

商品AA1は、月次平均在庫数は50。
これを一ヶ月で2倍の100個出庫。
ですから、在庫回転期間は0.5ヶ月。

商品AA2は、月次平均在庫数は75。
これを一ヶ月で50個出庫。
ですから、在庫を出庫しきるにはもう半月を必要とします。
よって、在庫回転期間は1.5ヶ月。

敢えて、単月で「在庫回転期間]を出すとすれば上図のようです。

この結果を、更に、次のようにレポートしたい。

商品名|7月度在庫回転期間|8月度在庫回転期間|9月度在庫回転期間|平均在庫回転期間|
AA1|____1/2ヶ月|____1/2ヶ月|____1/2ヶ月|___1/2ヶ月|

ならば、
課題は、単月での「在庫回転期間]を求めるだけで事足りるのではと思いますよ。「商品別在庫回転期間推移表」は、単に、レポート出力の手の問題。

【在庫回転期間の定義は横に置いて】

要は、「商品別在庫回転期間推移表」をレポートすれば事足りる訳ですので・・・

<<テーブル「在庫回転台帳」>>

ID=1
会社コード=XXXX
商品コード=XXXX

<<テーブル「在庫回転明細」>>

ID=1
在庫回転台帳_ID=1
月次=201405
月次月次出庫数=100
月次期首在庫=100
月次期末在庫=0
月次在庫回転率=2.00

※列[月次在庫回転期間]は、月次在庫回転率の逆数なので必要ありません。
※もちろん、質問者のいう「在庫回転率」でも同じ設計ですよ。

ID=1
在庫回転台帳_ID=1
月次=201405
前々月出庫数=XXX
前月出庫数=XXX
当月出庫数=XXX
月次在庫回転期間=XXX

あくまでも雛形。私には、月次在庫回転期間の求め方がよく理解できていませんので当てずっぽうで書いています。

という二つのテーブルを生成すれば簡単に目的は達成できるかと思いますよ。「商品別在庫回転期間推移表」の出力は小一時間で終了します。ですから、レポート出力のことは一切考える必要はありません。
    • good
    • 0

>要は、[会社コード], [品目コード], [月度],[集荷数]=0を追加すればよいだけと思いますが・・・。



もちろん、追加するユニオンは集計期間によって適宜作成するひつようがあります。

<例>

201406・・・201404,201405に登場する全てetc.
201407・・・201405,201406に登場する全てetc.
201408・・・201406,201407に登場する全てetc.
201409・・・201407,201408に登場する全てetc.
201410・・・201409,201410に登場する全てetc.

なお、

201404に登場したのは201405,201406にも発生させる
201405に登場したのは201406,201407にも発生させる
201406に登場したのは201407,201408にも発生させる

という考えもあります。

一体、どれが最も欲するものか?それは、実践をもって確認して下さい。それによっては、独自のユニオンになるかも知れません。要は、そのアイデアにのみ着目してもらえれば幸いです。

PS, MoveMonyh(XXXX,-3)→MoveMonyh(XXXX,-2)
    • good
    • 0

INSERT INTO 出荷履歴


SELECT *
FROM クエリ19;

これをやりたい意味が判りました。やっぱり移動平均を出したかったということでしょう。

思うに、やられていることはExcel的な処理にAccessを利用しているだけ。データも[出荷履歴]というより[月次出荷合計明細票]の類。だったら、INSERT文で解決も手です。ダミー行を追加しても用が済んだら削除すれば済む話。
「accessで移動平均する方法」の回答画像14
    • good
    • 0
この回答へのお礼

ありがとうございます
説明不足な点があり混乱させてしまったようです
やりたかった事はNO8さんのところに書いたのですが
在庫回転期間を求めたかったのです
その計算の元ネタとなる過去3ヶ月間の移動平均出荷数が求めたかったのです
入手できるデータは他に月末在庫データ

会社コード、品目コード、月度、数量の項目です
この月末在庫データと出荷履歴データを使って各月の在庫回転期間をNO8さんのところに書いた
計算式で求めたかったのが最終的な目的です
最初にこれを説明していればもっと簡単な方法があったかもしれないです
ごめんなさい

お礼日時:2014/10/24 22:03

データがない月度も表示させたいということですね。



表示したい月度の格納されたマスターテーブルを作成して、それと明細テーブルをクエリで外部結合すれば表示させることができます。

会社マスター、品目マスターテーブルも必要になりますが、ありますよね。

具体的な方法の提示は、現状のマスターテーブル等の名前、フィールド構成等が不明なのでできませんので、
とりあえずやってみて、できなかったら、上記の詳細の情報を追加して、どこまでできて、どこで躓いたのか提示して、返信してください。
    • good
    • 0

【補足の補足】移動平均法と出荷日



A商品の出荷は6、7月のみ。
B商品の出荷は7、8月のみ。
C商品の出荷は8、9月のみ。
D商品の出荷は10月のみ。

現実には、こういう状況が一般的。だとすれば、各々の商品の3ヶ月の移動平均を出力しても実に評価が難しいデータになるかと思いますよ。回答1で問うたのは、

>本当に移動平均ですか?
>単なる過去3ヶ月間の平均ですか?

このこと。ちょーっと、最初から喉にトゲがひかかったままなので補足して確認しておきます。
    • good
    • 0

【疑問】移動平均法と出荷日との関係



提示されているデータの出荷日は月で管理されています。つまり、過去3ヶ月を正確に指定できません。11月01日の伝票があった場合には09/01~11/01の約2ヶ月の平均出荷数になります。先の回答で、

>11月初旬の処理に問題があって・・・

と書いていますが、その意味を補足しておきます。出荷日が日付で管理されていればと思っています。
    • good
    • 0

できるというだけで、使えるのかわかりませんけど



テーブル名を「★★」と仮定します。
連続した月度生成用のテーブル「T月度」を新設します。
フィールドは「月度」(長整数)のみ

標準モジュールに以下を記述しておきます。
やっている内容は、テーブル「★★」内の最小月度、最大月度を求めて
その範囲の連続した yyyymm を作成します

Public Function myInit() As Boolean
  Dim rs As New ADODB.Recordset
  Dim sSql As String
  Dim dtS As Date, dtE As Date

  sSql = "DELETE * FROM T月度;"
  CurrentProject.Connection.Execute sSql

  rs.Source = "SELECT Min(月度), Max(月度) FROM ★★;"
  rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
  If (Not rs.EOF) Then
    dtS = CDate(Format(rs(0), "0000/00"))
    dtE = CDate(Format(rs(1), "0000/00"))
    rs.Close

    rs.Open "T月度", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
    While (dtS <= dtE)
      rs.AddNew
      rs(0) = Int(Format(dtS, "yyyymm"))
      rs.Update
      dtS = DateAdd("m", 1, dtS)
    Wend
    rs.Close
  End If
  myInit = True
End Function

この関数をSQLから呼び出して利用します。
以下の内容をSQLビューに記述した場合と結果は

SELECT Q1.会社コード, Q1.品目コード, Q1.月度, Round(Sum(Q2.出荷数)/3,2) AS 平均 FROM
(SELECT * FROM
(SELECT DISTINCT 会社コード, 品目コード FROM ★★), T月度) AS Q1
, ★★ AS Q2
WHERE myInit() AND
Q1.会社コード=Q2.会社コード AND Q1.品目コード=Q2.品目コード AND
Q2.月度 IN (SELECT TOP 3 月度 FROM T月度 WHERE 月度<=Q1.月度 ORDER BY 月度 DESC)
GROUP BY Q1.会社コード, Q1.品目コード, Q1.月度;

会社コード 品目コード 月度  平均
A00000001  AAAAAAA  201408  3.33
A00000001  AAAAAAA  201409  3.33
A00000001  AAAAAAA  201410  10
B00000002  BBBBBBB  201408  3.33
B00000002  BBBBBBB  201409  3.33
B00000002  BBBBBBB  201410  3.33


B00000002  BBBBBBB の 201409 / 201410 は要らないのなら


SELECT Q1.会社コード, Q1.品目コード, Q1.月度, Round(Sum(Q2.出荷数)/3,2) AS 平均 FROM
(SELECT * FROM
(SELECT DISTINCT 会社コード, 品目コード FROM ★★) AS T1, T月度 AS T2
WHERE T2.月度<=(SELECT Max(月度) FROM ★★ WHERE 会社コード=T1.会社コード AND 品目コード=T1.品目コード)) AS Q1
, ★★ AS Q2
WHERE myInit() AND
Q1.会社コード=Q2.会社コード AND Q1.品目コード=Q2.品目コード AND
Q2.月度 IN (SELECT TOP 3 月度 FROM T月度 WHERE 月度<=Q1.月度 ORDER BY 月度 DESC)
GROUP BY Q1.会社コード, Q1.品目コード, Q1.月度;

会社コード 品目コード 月度  平均
A00000001  AAAAAAA  201408  3.33
A00000001  AAAAAAA  201409  3.33
A00000001  AAAAAAA  201410  10
B00000002  BBBBBBB  201408  3.33


※ サンプルでできたというだけですので・・・
    • good
    • 0

1、[会社コード]+[品目コード]+[月度]


  の組合せで全ての月に出荷数=0を求めるクエリを作成。
2、INSERT INTO XXX SELECT XXX 同クエリ
  を実行する。

以上で確かに現象的には目的を達成出来ますが・・・。これは、ちょっと非現実的かと思いますね。テーブル[出荷履歴]には、主キーもあるでしょう。また、他のテーブルとのリンクも張ってあるでしょう。そこら辺りに十分に配慮してとなると、INSERT INTO 出荷履歴 SELECT * FROM クエリ19;と単純にいけるものか?VBAを推す理由です。

【出荷数=0を発生させるクエリ】

SELECT DISTINCT
  [会社コード],
  [品目コード],
  "201408" AS [月度],
  0 AS [出荷数]
FROM 出荷履歴 WHERE 月度 BETWEEN "201408" AND "201410"

UNION

SELECT DISTINCT
  [会社コード],
  [品目コード],
  "201409" AS [月度],
  0 AS [出荷数]
FROM 出荷履歴 WHERE 月度 BETWEEN "201408" AND "201410"

UNION

SELECT DISTINCT
  [会社コード],
  [品目コード],
  "201410" AS [月度],
  0 AS [出荷数]
FROM 出荷履歴 WHERE 月度 BETWEEN "201408" AND "201410";

【INSERT文】

INSERT INTO 出荷履歴
SELECT *
FROM クエリ19;
「accessで移動平均する方法」の回答画像9
    • good
    • 0

データのない月度も出力したいということですね。



回答の前にもう少し確認させてください。

> 追加したいデータは
>
> A00000001,AAAAAAA,201409,0
> B00000002,BBBBBBB,201410,0
> B00000002,BBBBBBB,201409,0

A00000001,BBBBBB,201410,0
A00000001,BBBBBB,201409,0
A00000001,BBBBBB,201408,0

は出力しなくていいのですか。
会社A00000001の取り扱う品目はAAAAAAだけなんでしょうか。

同様に、B00000002 の場合はAAAAAAは出力しないのですか。

会社のマスターテーブルは存在しますか。
また、それぞれの会社の取り扱い品目の情報はどのように管理してますか。


> これを一気に追加することが追加クエリでできるでしょうか?

追加クエリでデータを追加しなくても、マスターテーブルがあれば外部結合を使うことで実現はできます。

ただ、具体的な方法は、上記のマスターテーブルや取り扱い品目のテーブルの構成がどうなっいてるかが判明しないと提示できないですね。
    • good
    • 0
この回答へのお礼

コメントありがとうございます会社のマスターテーブルは存在しますが
自分はそのデータを入手する権限がありません

説明不足で申し訳ありません
何がしたいかというと毎月の在庫回転期間を求めたいのです
月末在庫のデータと出荷履歴のデータは入手できます

10月末の在庫数÷(10月の出荷数+9月の出荷数+8月の出荷数)÷3=10月の在庫回転期間
9月末の在庫数÷(9月の出荷数+8月の出荷数+7月の出荷数)÷3=9月の在庫回転期間
8月末の在庫数÷(8月の出荷数+7月の出荷数+6月の出荷数)÷3=8月の在庫回転期間

上記の値を会社コード、品目コード別に出力したかったのです
なので
月末在庫は存在しても出荷した事が一度もない不良在庫の物もありますので
9月に出荷した履歴がなくても(9月の出荷数+8月の出荷数+7月の出荷数)÷3で
3ヶ月の平均出荷数は求められると思います
なので出荷した履歴がない月も出荷数の平均を求めたかったのです
Vlookupで在庫と出荷平均を後で結合したデータを作って計算したかったので
出荷0の月もデータを出したいという事です

お礼日時:2014/10/24 21:56

このQ&Aに関連する人気のQ&A

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

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAccess グループ毎で直近25件分で移動平均を出したいのですが

例えば表名[株価推移]の項目に、[銘柄番号][日付(mmdd)][株価]とある場合。

銘柄毎、日付毎の株価の平均を出すのであれば、
SELECT [銘柄番号],[日付(mmdd)],AVG([日付(mmdd)]) FROM [株価推移] GROUP BY [銘柄番号],[日付(mmdd)];
で求まるのですが、直近の25件分での移動平均となると
どのようにすればよいか分かりません。

どなたか、教えていただけませんか。
よろしくお願いいたします。

Aベストアンサー

>一年間(1月~12月)の推移傾向が知りたいのでmmddにしています。
じゃ異なる年のものは含まれていないとして進めますね

>抜けはありますが、重複はありません。
ということなので日付の順番で連番を振り
該当レコードより25以前のもののみの合計を取ります

クエリを2段に使います

1つ目のクエリで銘柄番号毎に日付順に連番を振ります

連番: DCount("*","株価推移","日付<='" & [日付] & "' and 銘柄番号='" & 銘柄番号 & "'")

このクエリから移動平均を求めるクエリを作ります
(移動平均は日付じゃなく株価ですよね)

移動平均: DSum("株価","クエリ名","連番 between '" & IIf([連番]-24<1,0,[連番]-24) & "' And '" & [連番] & "' and 銘柄番号='" & 銘柄番号 & "'")

Qインポート時のエラー「データ型の変換エラー」

ACCESS2000を使用しています。
CSVファイルをマクロを使い、インポートしようとしているのですが、ある列に「33300G2」というデータがあります。
インポートのマクロを実行するとそのデータのみがインポートエラー(エラー内容は「データ型の変換エラー」)となってしまいます。
ちなみに、エラーが出る列は、「33300G2」以外全てが数字のみなのですが関係あるのでしょうか。
もし原因らしきものがわかればアドバイスよろしくお願いいたします。

Aベストアンサー

インポート定義をして下さい。
インポート→設定→データ型を変更して下さい。
何かあれば補足して下さい。
がんばれ

QOfficeアクセス テーブル「テキスト型」⇒「日付型」への変換について

テーブルにデータが保管されており、そのフィールドの一つに「テキスト型」で”20080301”のようなデータを持っています。これを「日付/時刻型」”2008/03/01”のように変換したいのですが、どのようにすればよいのでしょうか。

※ちなみにこのオリジナルデータは毎日、自動的にテーブルにダウンロードされており、このテーブル自体の型を予め「日付/時刻型」に変換すると、日々のデータ取得時にエラーとなってしまいます。ですので、「日付/時刻型」のフィールドを持った新規のテーブルに、この”20080301”のデータを変換し格納したいのですがどのようにすればよろしいでしょうか。

テーブル⇒デザインより、該当のフィールドの型を「テキスト型」⇒「日付/時刻型」へ直接変換してしまうと、「データの変換中にエラーが発生しました。○○件のレコードのデータが失われました。」と表示されます。素人のため、なるべく追加クエリや更新クエリや簡単な関数のみでの方法を教えていただけたら幸いです。

Aベストアンサー

テーブルに日付時刻型フィールドを追加して、
更新クエリを使って、#1さんが提案されている
数式を使えばよいのでは?

Q移動平均値のSQL

お世話になります。

株価の移動平均値、例えば5日の移動平均値をSQL文で求めたいと思っています。

+----------+-------+
| ymd | value |
+----------+-------+
| 19960401 | 21100 |
| 19960402 | 21200 |
| 19960403 | 21200 |
| 19960404 | 21800 |
| 19960405 | 21900 |
| 19960408 | 21500 |
| 19960409 | 22000 |
 ・・・
| 20070510 | 2570 |
| 20070511 | 2545 |
| 20070514 | 2530 |
| 20070515 | 2555 |
| 20070516 | 2545 |
| 20070517 | 2450 |
+----------+--------+

例えば、1996/4/5時点の5日移動平均値は、
| 19960401 | 21100 |
| 19960402 | 21200 |
| 19960403 | 21200 |
| 19960404 | 21800 |
| 19960405 | 21900 |
(21100+21200+21200+21800+21900)/5=21440
となります。

5日毎にgroup byする方法を見つけるかと考えましたが、今のところ見つけられません。
銘柄毎に2000件データ×4000銘柄分あります。
今回は1銘柄のみの考慮、つまり、日付と株価のみでの考慮をお願いしたいと思っております。
下記にありますサンプルのデータでありますと、19960405,19960408,19960409の3日に関して移動平均値が出る結果となります。
よろしくお願いいたします。

MySQLバージョン 5.0.37
Windows2000 SP4


サンプル

create table t_kabuka
(ymd int(8), value int(6),primary key(ymd));
insert into t_kabuka values
(19960401,21100),
(19960402,21200),
(19960403,21200),
(19960404,21800),
(19960405,21900),
(19960408,21500),
(19960409,22000);

お世話になります。

株価の移動平均値、例えば5日の移動平均値をSQL文で求めたいと思っています。

+----------+-------+
| ymd | value |
+----------+-------+
| 19960401 | 21100 |
| 19960402 | 21200 |
| 19960403 | 21200 |
| 19960404 | 21800 |
| 19960405 | 21900 |
| 19960408 | 21500 |
| 19960409 | 22000 |
 ・・・
| 20070510 | 2570 |
| 20070511 | 2545 |
| 20070514 | 2530 |
| 20070515 | 2555 |
| 20070516 | 2545 |
| 20070517 | 2450 |
+----------+----...続きを読む

Aベストアンサー

連続性がないデータなので厳しいですね。
行連番のフィールドなどあれば、それをキーに外部結合などして
SQLとして十分な性能を発揮できそうですが
いまのままだとサブクエリーを前提に無駄に重い処理がかかるとおもいます。

「移動平均 SQL」などで検索するといろんなやり方が紹介されていますので
ご自身で探してみるとよいでしょう

Q抽出条件でデータ型が一致しません。のエラーメッセージが出る

フォームで入力された値を、
次のファイルでクエリを読み込むときに代入するASPを作成しましたが、実行しようとすると、
「データ型が一致しません。」のエラーメッセージが出ます。
DBはACCESSを使用しています。ACCESSの対象テーブルで、
データ型を「テキスト型」にすると問題ないのですが、
「数値型」にすると、「データ型が一致しません」の
エラーメッセージになります。
フォームでは、プルダウンで「数値」を選択するようになっています。
宜しくお願いします。

Aベストアンサー

Where区に指定した条件のフィールドが数値なら『'』でくくる必要がありません

Set rs = db.Execute("SELECT テーブル3.* FROM テーブル3 WHERE (テーブル3.番号)=" & bangou)
といった具合に修正してみましょう

『'』でくくる必要があるのは対象のフィールドが文字列の場合です

Q加重平均と平均の違い

加重平均と平均の違いってなんですか?
値が同じになることが多いような気がするんですけど・・・
わかりやす~い例で教えてください。

Aベストアンサー

例えば,テストをやって,A組の平均点80点,B組70点,C組60点だったとします.
全体の平均は70点!・・・これが単純な平均ですね.
クラスごとの人数が全く同じなら問題ないし,
わずかに違う程度なら誤差も少ないです.

ところが,A組100人,B組50人,C組10人だったら?
これで「平均70点」と言われたら,A組の生徒は文句を言いますよね.
そこで,クラスごとに重みをつけ,
(80×100+70×50+60×10)÷(100+50+10)=75.6
とやって求めるのが「加重平均」です.

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QAccessを使った株価分析

Accessを使った株価のデータベースを使い株価分析をしています。
日足の時系列データはゲットできましたが、全銘柄の週足時系列データが手に入りません。
一度に全銘柄の週足時系列データを入手する方法はないでしょうか?
または、日足データから週足データに変換する方法はないでしょうか?
よろしくお願いいたします。
ちなみにAccess暦一ヶ月のシロウトです。(分厚い参考書は持っています)

Aベストアンサー

こんなんありました。

http://homepage2.nifty.com/portal/link/data.htm


ところでAccessを選んだ理由は何でしょうか。
Accessはデータベースソフトで、データを加工したり抽出したりは、確かにできます。
しかしその抽出の仕方や表示のフォーマットまで定義してやる必要があります。
数値計算ソフトではなく、数値をデータの蓄積として扱うソフトです。

Excel(表計算ソフト)は数値の計算を得意とし、関数も豊富ですし、数値を扱う上でのフォーマット(通貨や日付や、数値の増減の認識がパターン)も最初から組み込まれているので、楽だと思うのですが。

とくにアウトプット(印刷やグラフ・チャート作成)まで考えると、Excelのほうが圧倒的に楽です。

Qアクセスのフィールド表示を2段にする方法・抽出の方法

アクセスで名簿をつくっています
1000人以上の名簿になってしまい
フィールド項目もかなり多くなっています
(”名前””なまえ””住所””所属””転居先不明者””喪中”など)
(1)なるべく項目を短くまとめたいのですが
 あまり短くすると他の人が見たときにわかりにくいので
 エクセルでいう、「折り返して表示」のような機能がないものでしょう か?または表示のフォントを小さくすることはできませんか?
(2)同じフィールド内に
 先生、友人、外先生、内先生、学内事務、企業
 などの入力がされています
 ただ、友人だけれども先生の場合は
 ”友人 先生”のように2つ並んでいたりして
 その書き方は不規則です(”先生 友人”となっていなりもします)
 抽出する際に
 1)”先生”を含むものを全部抽出(先生、外先生、内先生)
 2)”友人”を含むけれども”先生”は含まないもの
 のようにいろいろ条件をかえて抽出することはできませんか?
 アクセスの初心者なのですが同じフィールドの中にいくつも言葉を並べ ることはナンセンスのように思えるのですが、どういうものですか?
 全部別のフィールドにしたほうがいいのではないかと思うのですが…?
(3)ON/OFを使って年賀状を出した人出していない人をチェックしています
 ONのものだけをテーブルの中で抽出するためにはどのようにすればいい でしょうか?

よろしくお願いします

 

アクセスで名簿をつくっています
1000人以上の名簿になってしまい
フィールド項目もかなり多くなっています
(”名前””なまえ””住所””所属””転居先不明者””喪中”など)
(1)なるべく項目を短くまとめたいのですが
 あまり短くすると他の人が見たときにわかりにくいので
 エクセルでいう、「折り返して表示」のような機能がないものでしょう か?または表示のフォントを小さくすることはできませんか?
(2)同じフィールド内に
 先生、友人、外先生、内先生、学内事務、企業
 などの入力がされています
...続きを読む

Aベストアンサー

(1)について。
ひょっとして、テーブルをそのままデータシートビューで使ってますか?
データシートビューのフォントは、「ツール」→「オプション」→「データシート」で、変更可能です。

折り返しに関しては、「書式」→「行の高さ」を増やせば、自動的に折り返すと思います。


(2)について。
> 1)”先生”を含むものを全部抽出(先生、外先生、内先生)

クエリのデザイン画面で、抽出条件の欄に

Like "*先生*"

と、入力してください。これで、「先生」を含むレコードが選択できます。


> 2)”友人”を含むけれども”先生”は含まないもの

同様に、クエリのデザイン画面で、抽出条件の欄に

(Like "*友人*") And (Not Like "*先生*")

と入れます。「友人」に関しては上記と同様です。
And は複数の条件を満たす必要がある場合に使います。
Not をつけると、「先生」を含まない、という条件になります。
() は見やすくするために入れました、無くても可。


>アクセスの初心者なのですが同じフィールドの中にいくつも言葉を並べ ることはナンセンスのように思えるのですが、どういうものですか?

データベースの理論上は良くない事ですが、ケースバイケースです。私もこういう手抜きをすることありますよ。


> 全部別のフィールドにしたほうがいいのではないかと思うのですが…?

データベース理論では、別フィールドではなく、別にテーブルを用意する事になると思います。慣れないうちは、余計にややこしくなりますので、しなくても良いと思います。

本格的に、データベースの勉強をするのであれば、「データベース 正規化」で検索して見て下さい。


(3)について。回答出てますので、省略。

(1)について。
ひょっとして、テーブルをそのままデータシートビューで使ってますか?
データシートビューのフォントは、「ツール」→「オプション」→「データシート」で、変更可能です。

折り返しに関しては、「書式」→「行の高さ」を増やせば、自動的に折り返すと思います。


(2)について。
> 1)”先生”を含むものを全部抽出(先生、外先生、内先生)

クエリのデザイン画面で、抽出条件の欄に

Like "*先生*"

と、入力してください。これで、「先生」を含むレコードが選択できます。


> ...続きを読む

Qエクセルで空白セル”” と未入力セルの違い

関数で セルA1 に=if(B1=0,"","入力済")
としました。
セルの選択を素早くするためにショートカットキー「Ctrl+↓」を
利用しています。
通常の未入力空白セルは上記のショートカットで飛ばされて選択
されません。
これに対して上記関数で ""  として入力されたものを
コピーして値だけを貼り付けたとしても
上記ショートカットキーで飛ばされず選択されてしまいます。
見た目は 全く同じ 空白セルです。(関数も値貼り付けをしているので消えています。)
未入力の空白セルと 関数で""と入力されて値貼り付けを受けたセルではどこが違うのでしょうか。
また、未入力の空白セルに 戻すには関数でどのように入力させればいいのでしょうか。もちろんDeleteKeyを使って未入力の空白セルに
戻るのですがそれではショートカットキーでとばせるメリットがなくなります。関数で大量に処理したいのです。
おわかりの方お教えください。

Aベストアンサー

>未入力の空白セルと 関数で""と入力されて値貼り付けを受けたセルではどこが違うのでしょうか。

未入力の空白セルは「ISBLANK関数」で「真」を返します。

一方、値としての""が貼り付けられたセルは「ISBLANK関数」で「偽」を返します。

>また、未入力の空白セルに 戻すには関数でどのように入力させればいいのでしょうか。
不可能です。「式」は「値」を返すので「空白セル」と言う「状態」を返す事は出来ません。

>もちろんDeleteKeyを使って未入力の空白セルに
>戻るのですがそれではショートカットキーでとばせるメリットがなくなります。関数で大量に処理したいのです。

つまり「セルを1つづつ選択してDeleteキーで1つづつ空白セルに戻すのが面倒」なので「全部を一気に空白セルに戻す良い方法は無いか?」と言う事ですね?

だったら簡単です。

すべての式を
=if(B1=0,"","入力済")
ではなく
=if(B1=0,1/0,"入力済")
にしておきましょう。

すると、未入力の所は、空白("")にならず「#DIV/0!」になります。

そう表示されたら、シート全体を選択し「CTRL+G」を押して「ジャンプ」を出します。

「ジャンプ」のダイアログが出たら「セル選択」を押し、セル選択のダイアログを出します。

セル選択のダイアログが出たら「数式」を選び、その下のチェックは「エラー値」だけにします。

「OK」を押してダイアログを閉じると「#DIV/0!」の表示になったセルのみが選択状態になります。

「#DIV/0!」の表示になったセルのみが選択状態になったら、Deleteキーを押して、それらのセルを一気に「空白セル」にして下さい。

もちろん、大量にあっても、手順は変わりません。

>未入力の空白セルと 関数で""と入力されて値貼り付けを受けたセルではどこが違うのでしょうか。

未入力の空白セルは「ISBLANK関数」で「真」を返します。

一方、値としての""が貼り付けられたセルは「ISBLANK関数」で「偽」を返します。

>また、未入力の空白セルに 戻すには関数でどのように入力させればいいのでしょうか。
不可能です。「式」は「値」を返すので「空白セル」と言う「状態」を返す事は出来ません。

>もちろんDeleteKeyを使って未入力の空白セルに
>戻るのですがそれではショ...続きを読む


人気Q&Aランキング

おすすめ情報