プログラミング

プログラミングに関するフォーラムです。VBAは除きます。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : その他)
SQLで直近2件のデータを抜き出したい
投稿日時: 21/01/27 19:52:38
投稿者: silk123

下記の様なデータがあります。
この中で直近2回の入金フラグが0の人を抜き出す場合にはどの様にSQLで表記すればよろしいでしょうか
(下記の例ではcccが該当者)
 
入金テーブル
氏名  配達日 入金フラグ
aaa 20201001 1
aaa 20201101 0
aaa 20201201 1
bbb 20201001 0
bbb 20201101 0
bbb 20201201 1
ccc 20200901 1
ccc 20201001 1
ccc 20201101 0
ccc 20201201 0
 
 

回答
投稿日時: 21/01/27 23:09:20
投稿者: よろずや

DBMS の指定がありませんが、moug ですので仮にAccessとして回答します。
 

SELECT C.氏名, Min(C.配達日) AS 配達日1, Max(C.配達日) AS 配達日2
FROM (SELECT A.氏名, A.配達日, A.入金フラグ
FROM 入金テーブル AS A
WHERE (SELECT COUNT(*) FROM 入金テーブル AS B
   WHERE A.氏名 = B.氏名 AND A.配達日 <= B.配達日) <= 2)  AS C
GROUP BY C.氏名
HAVING (((Sum(IIf([入金フラグ]=0,1,0)))=2));

投稿日時: 21/01/28 13:19:36
投稿者: silk123

ご回答いただきまして、ありがとうございます。
DBはACCESSです。
早速実行した所、「抽出条件で型が一致しません」エラーになりました。
テーブルのデータ型は全て「短いテキスト」になっています。
原因が分からず、困っております

回答
投稿日時: 21/01/28 13:51:42
投稿者: hatena
投稿者のウェブサイトに移動

silk123 さんの引用:
早速実行した所、「抽出条件で型が一致しません」エラーになりました。
テーブルのデータ型は全て「短いテキスト」になっています。

 
HAVING (((Sum(IIf([入金フラグ]=0,1,0)))=2));

 
上記の部分を下記に修正すればいいでしょう。
 
HAVING (((Sum(IIf([入金フラグ]="0",1,0)))=2));

 
自分も考えてみたので提示しておきます。
 
SELECT t1.氏名
FROM 入金テーブル AS t1
WHERE
 t1.配達日 In
  (SELECT TOP 2 t2.配達日
   FROM 入金テーブル AS t2
   WHERE t2.氏名=t1.氏名
   ORDER BY t2.配達日 DESC)
GROUP BY t1.氏名
HAVING Sum(Val([入金フラグ]))=0;

投稿日時: 21/01/28 15:20:38
投稿者: silk123

ありがとうございました。
大変参考になりました。