質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

1382閲覧

一つ前とのフィールド比較について

OSK_TAROU

総合スコア4

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/01/15 02:46

編集2020/01/15 03:34

前提・実現したいこと

書庫的な質問ですいません。

SQLで上手く出力されない為、困っています。
教えて頂ければ幸いです。

ACCSESで作成しています。
フィールド
1.NO
2.名称
3.金額
4.登録日
こんな感じのレコードが有り
最新の金額と一つ前のレコードの金額を比較したいのですが上手く表示されません。

select A.NO,A.名称,A.金額,A.登録日,B.金額,B.登録日
from teble as A,teble as B
WHERE
A.金額>B.金額
AND A.NO=(select Max(C.NO) from teble as C)
AND B.NO=(select Max(C.NO)-1 from teble as C)

同じテーブルを参照しています。
teble as A
teble as B

よろしくお願い致します。

*** 追記
説明不足ですいません。

NOは連番になっています。
名称毎にNOが昇順でカウントアップされます。

Noはユニークでは無いです。
出力結果が1件も無いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatena19

2020/01/15 02:55

「一つ前のレコード」の定義は何でしょうか。 「登録日」が基準でしょうか。「NO」が基準でしょうか。「NO」は連番になっているのでしょうか。
OSK_TAROU

2020/01/15 03:00 編集

NOが基準です。 NOは連番になっています。 名称毎にNOが昇順でカウントアップされます。 説明不足ですいません。
hatena19

2020/01/15 03:05

それを質問の方に追記しておいてください。このコメント欄は通常は閉じてますので、回答者の目に留まらない可能性大ですので。
momon-ga

2020/01/15 03:17

> 名称毎にNOが昇順でカウントアップされます。 NOはユニークではないということですか? > SQLで上手く出力されない について、具体的に想定と結果を記載してください。(出力されない?金額が想定と異なる?) なんとなくですが、NOがユニークでないのが原因かと想像しますが。B.名称を表示すると原因わかるかも
OSK_TAROU

2020/01/15 03:30

Noはユニークでは無いです。 出力結果が何も出ないです。
hatena19

2020/01/15 03:51

名称毎に連番ということは、名称+NOの組み合わせではユニークということですよね。 NOの連番は抜けはないですか。
guest

回答2

0

最新の金額と一つ前のレコードの金額を比較したいのですが上手く表示されません。
出力結果が1件も無いです。

最新は常に表示するという事なら、一つ前のレコードが無い場合も出力したいと解釈しました。
こういった場合は外部結合(left join)を使用します。

但し、レコードを限定する必要がありますので、NOと登録日でユニークとみなしました。

SQL

1select A.[NO], A.名称, A.金額, A.登録日, B.金額, B.登録日 2from ( 3 SELECT t1.*, (select max(登録日) from Teble where [NO]=t1.[NO]-1) asNO登録日 4 FROM Teble t1 5 ) as A 6 left join Teble as B 7 on A.[NO]-1=B.[NO] and A.NO登録日=B.登録日 8WHERE A.金額 > Nz(B.金額)

※[NO, 登録日]のインデックスはあった方が良いでしょう。

質問の内容が、同NOで最新の登録日と一つ前の登録日の比較という事でしたら、以下です。
※違う名称のものと比較するという事は考え辛いので、多分こういう事かなと思います。

SQL

1select A.[NO], A.名称, A.金額, A.登録日, B.金額, B.登録日 2from ( 3 SELECT t1.* 4 , (select max(登録日) from Teble 5 where [NO]=t1.[NO] and 登録日< t1.登録日 6 ) as 前登録日 7 FROM Teble t1 8 where 登録日=(select Max(登録日) from Table where [NO]=t1.[NO]) 9 ) as A 10 left join Teble as B 11 on A.[NO]=B.[NO] and A.前登録日=B.登録日 12WHERE A.金額 > Nz(B.金額)

投稿2020/01/15 04:03

編集2020/01/15 05:30
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

最新の金額と一つ前のレコードの金額を比較したいのですが上手く表示されません。

  

NOが基準です。
NOは連番になっています。
名称毎にNOが昇順でカウントアップされます。

下記のようなSQLでどうでしょうか。

sql

1SELECT 2 A.*, B.金額,B.登録日 3FROM 4 Teble AS A LEFT JOIN Teble AS B 5 ON A.名称 = B.名称 AND A.[NO]-1 = B.[NO];

ちなみに、「NO」というフィールド名は変更したほうがいいでしょう。予約語ですのでいろいろトラブルの原因になりかねません。とりあえず[]で囲むことで回避はできますが。


「最新の金額と一つ前のレコードの金額を比較したい」の「最新」を読み飛ばしていました。
名称毎の最新の金額と一つ前のレコードの金額を表示したいということなら、下記のようにWHERE句を追加してください。

sql

1SELECT A.*, B.金額, B.登録日 2FROM Teble AS A LEFT JOIN Teble AS B ON (A.名称 = B.名称) AND (A.[NO]-1 = B.[NO]) 3WHERE 4A.[NO]=(SELECT MAX([NO]) FROM Teble AS C WHERE C.名称=A.名称);

投稿2020/01/15 03:15

編集2020/01/15 04:14
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

OSK_TAROU

2020/01/15 03:39

貴重な時間を割いていただき、回答、有難うございます。 JOINを追加しましても、同じ(何も出力されない)結果となりました。 良く解っていないです。 SQL難しいです。
hatena19

2020/01/15 03:45

質問にテーブルのデータ例を追加してもらえますか。 こちらで簡単なサンプルデータを作成して試して限りでは表示できました。 「Teble」とか「NO」というのも実際のフィールド名ですか。 できれば実際のもので提示してもらった方かいいです。 フィールド名が適切でなかったためにうまくいかなかったということもありますので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問