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

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

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

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

SQL

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

Q&A

解決済

1回答

2439閲覧

Accessでユニークユーザーを月ごとに累計したい

yu_pe

総合スコア13

Access

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

SQL

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

0グッド

0クリップ

投稿2019/03/14 06:16

編集2019/03/14 06:42

実現したいこと

お世話になっております。
Access2016でクエリを作っています。
ユニークユーザーを月ごとに年度内で累計していくクエリを作りたいのですが、
同じ年度内で同じユーザーIDが別の月に出た場合は1カウントとしたいです。
アドバイスお願いいたします!

※「ID」はオートナンバー型です。

【元データ】

ID見積月ユーザーID
12018/4/1A
22018/4/1A
32018/4/1B
42018/5/1B
52018/5/1C
62018/6/1A
72018/6/1B
82018/6/1D

【結果】
|年度|年|月|ユーザー数|
|:--|:--:|--:|
|2018|2018|4|2|
|2018|2018|5|3|
|2018|2018|6|4|

試したこと

下記のようなクエリをSQLビューで作ってみたところ、エラーになりました。

■サブクエリ内で親クエリのフィールドを参照できない

select Format$(DateAdd("m",-3,A.見積月),"yyyy") AS 年度, Format$(A.見積月,"yyyy") AS 年, Format$(A.見積月,"m") AS 月, (select count([元データ]![ユーザーID]) from 元データ where Format$([元データ]![見積月],"yyyymm") <= Format$(A.見積月,"yyyymm")) as ユーザー数 from 元データ as A group by Format$(DateAdd("m",-3,A.見積月),"yyyy") AS 年度, Format$(A.見積月,"yyyy") AS 年, Format$(A.見積月,"m") AS 月 order by Format$(DateAdd("m",-3,A.見積月),"yyyy") AS 年度, Format$(A.見積月,"yyyy") AS 年, Format$(A.見積月,"m") AS 月;

■Join式がサポートされていませんというエラー

select format$(dateadd("m",-3,a.見積月),"yyyy") as 年度, format$(a.見積月,"yyyy") as 年, format$(a.見積月,"m") as 月, format$(a.見積月,"yyyymm") as 比較用, b.ユーザー数 from 元データ as a inner join ( select format$(dateadd("m",-3,[元データ]![見積月]),"yyyy") as 年度, format$([元データ]![見積月],"yyyy") as 年, format$([元データ]![見積月],"m") as 月, format$([元データ]![見積月],"yyyymm") as 比較用, count([元データ]![ユーザーID]) as ユーザー数 from 元データ group by format$(dateadd("m",-3,[元データ]![見積月]),"yyyy"), format$([元データ]![見積月],"yyyy"), format$([元データ]![見積月],"m"), format$([元データ]![見積月],"yyyymm") ) as b on (a.年度 = b.年度) and (b.比較用 <= a.比較用);

補足情報(FW/ツールのバージョンなど)

Win7、Access2016です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

■サブクエリ内で親クエリのフィールドを参照できない

そうではなく、group byやorder byにエイリアス(As)が付いているからだと思います。

■Join式がサポートされていませんというエラー

デザインビューだと駄目でしょうけど、SQLビューだと実行できそうですけど。

追記

以下でどうでしょうか。
※年度考慮もれを訂正

SQL

1select 2 年度 3 , Format(見積月, "yyyy") As4 , Format(見積月, "m") As5 , Count(*) As ユーザー数 6from ( 7 select A.年度, A.見積月, B.ユーザーID 8 from ( 9 select Format(DateAdd("m",-3,見積月), "yyyy") AS 年度, 見積月 10 from 元データ 11 group by Format(DateAdd("m",-3,見積月), "yyyy") , 見積月 12 ) As A 13 inner join ( 14 select Format(DateAdd("m",-3,見積月), "yyyy") AS 年度, 見積月, ユーザーID 15 from 元データ 16 group by Format(DateAdd("m",-3,見積月), "yyyy"), 見積月, ユーザーID 17 ) As B 18 on A.年度=B.年度 and A.見積月>=B.見積月 19 group by A.年度, A.見積月, B.ユーザーID 20) As C 21group by 年度, 見積月

※上記のB部分を別途クエリーにして使用すると、少し記述が簡潔になりますね。

投稿2019/03/14 07:08

編集2019/03/14 09:21
sazi

総合スコア25188

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

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

yu_pe

2019/03/14 07:42

お忙しいなか早速のご回答ありがとうございます! 「as」の件、見落としておりました!失礼いたしました。 修正してみましたが、やはり正しい結果が出ません。 たびたび申し訳ございませんが、どうしたらよろしいでしょうか。 ■サブクエリ→「クエリに集計関数の一部として指定された'見積月'が含まれていません」というエラーになります。 select Format$(DateAdd("m",-3,A.見積月),"yyyy") AS 年度, Format$(A.見積月,"yyyy") AS 年, Format$(A.見積月,"m") AS 月, (select Count(Format$(B.user_id,"000000")) from 元データ as B where Format$(B.見積月,"yyyymm") <= Format$(A.見積月,"yyyymm")) as ユーザー数 from 元データ as A group by Format$(DateAdd("m",-3,A.見積月),"yyyy"), Format$(A.見積月,"yyyy"), Format$(A.見積月,"m") order by Format$(DateAdd("m",-3,A.見積月),"yyyy"), Format$(A.見積月,"yyyy"), Format$(A.見積月,"m"); ■inner join → 月ごとのユーザー数のパターンが複数出てしまいました。 select format$(dateadd("m",-3,a.見積月),"yyyy") as 年度, format$(a.見積月,"yyyy") as 年, format$(a.見積月,"m") as 月, format$(a.見積月,"yyyymm") as 比較用, b.ユーザー数 from 元データ as a inner join ( select format$(dateadd("m",-3,[元データ]![見積月]),"yyyy") as 年度, format$([元データ]![見積月],"yyyy") as 年, format$([元データ]![見積月],"m") as 月, format$([元データ]![見積月],"yyyymm") as 比較用, count([元データ]![user_id]) as ユーザー数 from 元データ group by format$(dateadd("m",-3,[元データ]![見積月]),"yyyy"), format$([元データ]![見積月],"yyyy"), format$([元データ]![見積月],"m"), format$([元データ]![見積月],"yyyymm") ) as b on (format$(dateadd("m",-3,a.見積月),"yyyy") = b.年度) and (b.比較用 <= format$(a.見積月,"yyyymm"));
sazi

2019/03/14 07:52 編集

サンプル追記されていたので、コメント削除
yu_pe

2019/03/15 00:08

うまくいきました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問