- ベストアンサー
Accessのsql(ロジック)について伺います
- AccessのローカルDB(ADO)へSQL接続するプログラムを作成し、マスタTBLから最繁日3日分の全レコードを抽出し、別のテーブルへ登録したい。
- 抽出には時分秒も必要であり、さらに時間別かつコード別の件数を求めるため、2段階に分けて処理を行う予定。
- 現在のSQLでは、group byで結果をまとめてしまい、全レコードを羅列できない。また、時分秒を省いてしまうと第2段階の処理が行えない。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こういうことですか? オリジナルテーブル名を、T1 としています。 SELECT TOP 3 年, 月, 日, コード, count(*) AS cnt FROM T1 GROUP BY 年, 月, 日, コード ORDER BY count(*) DESC; で上位3位まで取り出します。 ただし、『同値のcount(*) AS cnt が多い場合』は 3件よりも多くなります。 このクエリを Q1 として、 SELECT T1.年, T1.月, T1.日, T1.時, T1.分, T1.秒, T1.[コード], Q1.cnt FROM T1 INNER JOIN Q1 ON (T1.[コード] = Q1.[コード]) AND (T1.日 = Q1.日) AND (T1.月 = Q1.月) AND (T1.年 = Q1.年); としてみると? 一つにまとめると T1_out テーブルが、年、月、日、時、分、秒、コード、cnt フィールドで用意されていたら INSERT INTO T1_out SELECT [T1].年 AS 年, [T1].月 AS 月, [T1].日 AS 日, [T1].時 AS 時, [T1].分 AS 分, [T1].秒 AS 秒, [T1].[コード] AS コード, QX.cnt AS cnt FROM T1 INNER JOIN (SELECT TOP 3 年, 月, 日, [コード], count(*) AS cnt FROM T1 GROUP BY 年, 月, 日, [コード] ORDER BY count(*) DESC) AS QX ON ([T1].[コード]=QX.[コード]) AND ([T1].日=QX.日) AND ([T1].月=QX.月) AND ([T1].年=QX.年); かな? テスト環境でお試しを。
その他の回答 (1)
- bin-chan
- ベストアンサー率33% (1403/4213)
サブクエリ+Topキーワードでどうでしょう? 試験環境が手元にないので、まずはSelectのみ行って試験してください。 select 年, 月, 日, 時, 分, 秒, コード, count(*) カウント FROM マスタTBL where (年 & 月 & 日) in ( select top 3 年 & 月 & 日 年月日, count(*) カウント FROM マスタTBL gropu by 年月日 order by カウント desc ) group by 年, 月, 日, 時, 分, 秒, コード order by 年, 月, 日, 時, 分, 秒, コード ;
お礼
ご回答ありがとうございました。 もう半年も前にご丁寧なご回答を頂いたにも関わらず、諸事情によりお礼ができずに申し訳ございませんでした。