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

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

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

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

SQL

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

Q&A

解決済

3回答

724閲覧

【SQL】ACCESSのSQLを使って複数の条件による値をカウントしたいです。

player31

総合スコア21

Access

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

SQL

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

0グッド

0クリップ

投稿2021/03/09 13:40

編集2021/03/10 00:22

以下二つのテーブル(Tabl1とTabl2)からSQLを使って複数の条件による値をカウントしたいです。
条件①Tabl1とTabl2をIDとDateで照合
条件②Tabl1のStart Timeになる前にTable2のValueの値が”最後に”5を超えた時間からStart Timeまでの時間をカウント

Tabl1
|ID|Date|Start Time|Goal Time
|:--|:--:|--:|
A|2020/2/10|2020/2/10 10:00|2020/2/10 14:00
B|2020/1/5|2020/1/5 12:00|2020/1/5 13:00

Table2

IDTimeValue
A2020/2/10 5:002
A2020/2/10 6:005
A2020/2/10 7:003
A2020/2/10 8:006
A2020/2/10 9:001
A2020/2/10 10:001
A2020/2/10 11:003
A2020/2/10 12:005
A2020/2/10 13:002
A2020/2/10 14:008
A2020/2/10 15:003
B2020/1/5 8:001
B2020/1/5 9:005
B2020/1/5 10:001
B2020/1/5 11:001
B2020/1/5 12:003
B2020/1/5 13:001
B2020/1/5 14:005

抽出したい結果

IDDateValueTime
A2020/2/102
B2020/1/53

下記のようなクエリを考えていますが、なかなかうまくできません…

SQL

1SELECT Table1.ID, Table1.Date, Count(Table2.Value) as ValueTime 2FROM Table1, Table2 3WHERE Table1.ID = Table2.ID AND Table1.Date = Format(Table2.Time,"yyyy/mm/dd") AND Table2.Time <> BETWEEN Start Time AND Goal Time 4GROUP BY Table1.ID, Table1.Date

方法をご存じの方ががいらっしゃいましたら、ぜひ教えていただけたら幸いです。よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2021/03/09 22:36

SQLiteは本件とはどう関係するのでしょう
sazi

2021/03/09 23:19 編集

抽出したい結果についてGoal Timeは関係ないのでしょうか? それから、関係ない場合ですけど、抽出したい場合の結果のBは2では無いのですか?
player31

2021/03/09 23:29

ご指摘ありがとうございます。SQLiteタグは間違えていたため削除しました。 To:sazi様 説明不足で申し訳ございません。抽出したい結果についてGoal Timeは関係ないです。 Bは、「2020/1/5 9:00」「2020/1/5 10:00」「2020/1/5 11:00」で3を抽出したいです。
sazi

2021/03/09 23:37

start timeまでという事は分かりました。 同ID同dateでは、複数のstarttimeは無い(table1の主キーはidとdate)でしょうか。
player31

2021/03/10 00:04

ご連絡ありがとうございます。 同ID同dateでは、複数のstarttimeは無い認識で合っています。 主キーは、’ID’と’Date’です。 よろしくお願いいたします。
sazi

2021/03/10 00:20 編集

> Bは、「2020/1/5 9:00」「2020/1/5 10:00」「2020/1/5 11:00」で3を抽出したいです。 同じ理屈なら、Aは4ではないですか? ↑失礼。6がいますね。
player31

2021/03/10 00:21

Aは、Start Timeになる前にValueの値が”最後に”5を超えた時間が「2020/2/10 8:00」なので、「2020/2/10 8:00」と「2020/2/10 9:00」の2になります。 すみません、"最後に"をつけ忘れていました。修正させて頂きます。
guest

回答3

0

ベストアンサー

  • 「start_timeと同じ日、かつ、start_timeより前、かつ、最後にvalueが5以上になった時間」以上
  • 「start_time」未満

上の条件を満たすtable2の行数を数えたいということであっていますか?

であれば、これをそのままクエリにすれば良いかと思います。

SQL

1SELECT 2 a.id, 3 a.date, 4 (SELECT COUNT(*) 5 FROM table2 AS b 6 WHERE a.id = b.id 7 AND a.date = DATEVALUE(b.time) 8 AND (SELECT MAX(c.time) 9 FROM table2 AS c 10 WHERE a.id = c.id 11 AND a.date = DATEVALUE(c.time) 12 AND c.time < a.start_time 13 AND c.value >= 5) <= b.time 14 AND b.time < a.start_time) AS value_time 15FROM table1 AS a

2021-03-11 10:00 追記

  • 「start_timeより前、かつ、最後にvalueが5以上になった時間(Table1.Dateと同じ日とは限らない)」以上
  • 「start_time」未満

↑が実際の仕様であるならば、SQLは以下のようになるかと思います。

SQL

1SELECT 2 a.id, 3 a.date, 4 (SELECT COUNT(*) 5 FROM table2 AS b 6 WHERE a.id = b.id 7 AND (SELECT MAX(c.time) 8 FROM table2 AS c 9 WHERE a.id = c.id 10 AND c.time < a.start_time 11 AND c.value >= 5) <= b.time 12 AND b.time < a.start_time) AS value_time 13FROM table1 AS a

投稿2021/03/10 13:41

編集2021/03/11 01:12
neko_the_shadow

総合スコア2259

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

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

player31

2021/03/10 14:18

ご回答ありがとうございます。 最後にvalueが5以上になった時間がstart_timeと異なる日(1日前の日)になることもあるのですが、その場合はどのようにすればよいのでしょうか。 よろしくお願いいたします。
player31

2021/03/11 13:41

ありがとうございました。やりたいことができました。
guest

0

条件②Tabl1のStart Timeになる前にTable2のValueの値が”最後に”5を超えた時間からStart Timeまでの時間をカウント

提示のデータでは Time は1時間間隔の連続数になってますので、”最後に”5を超えた時間からStart Timeまでの時間差としました。(連続数とは限らないなら指摘してください)

sql

1SELECT 2 Tabl1.ID, 3 Tabl1.Date, 4 DateDiff("h",Max(Tabl2.Time),Tabl1.[Start Time]) AS ValueTime 5FROM 6 Tabl1 INNER JOIN Tabl2 7 ON Tabl1.ID = Tabl2.ID 8 AND Tabl1.Date = DateValue(Tabl2.Time) 9WHERE 10 Tabl2.Time < Tabl1.[Start Time] 11 AND Tabl2.Value >= 5 12GROUP BY 13 Tabl1.ID, Tabl1.Date, Tabl1.[Start Time];

投稿2021/03/10 01:05

hatena19

総合スコア33763

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

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

player31

2021/03/10 12:12

ご回答ありがとうございます。DateDiffで時間差が取れること、とても勉強になりました。 また、1つ教えていただけないでしょうか。 ”最後に”5を超えた時間がStart Timeと異なる日にちの場合(Start Timeの1日前の日)は、どうすればよろしいのでしょうか。 お手数をおかけしますがどうぞよろしくお願いいたします。
hatena19

2021/03/10 19:23

質問の 条件①Tabl1とTabl2をIDとDateで照合 がTimeの日付部分がDateと同じという意味なら、Start Time と Time の日付が異なることはないと思いますが。 条件①を矛盾のない、明確な基準で誤解なく伝わるように修正してもらえませんか。 「”最後に”5を超えた時間がStart Timeと異なる日にちの場合」となる場合のデータ例を質問に追記してもらえますか。
guest

0

検出したい、table2の条件を作ります。

SQL

1select t1.ID, t1.Keydate, t1.starttime, max(t2.time) as rangetime 2from Table1 as t1 3 inner join table2 as t2 4 on t1.id=t2.id 5 and t1.keydate = DateValue(t2.time) 6 and t1.starttime > t2.time 7where t2.data_value >= 5 8group by t1.ID, t1.Keydate, t1.starttime

これを軸に、table2と結合したものを集計します。

SQL

1select t3.id, t3.keydate, count(t4.ID) as valuetime 2from ( 3 select t1.ID, t1.Keydate, t1.starttime, max(t2.time) as rangetime 4 from Table1 as t1 5 inner join table2 as t2 6 on t1.id=t2.id 7 and t1.keydate = DateValue(t2.time) 8 and t1.starttime > t2.time 9 where t2.data_value >= 5 10 group by t1.ID, t1.Keydate, t1.starttime 11 ) t3 12 left join table2 as t4 13 on t3.id=t4.id 14 and t4.time < t3.starttime 15 and t4.time >= t3.rangetime 16group by t3.id, t3.keydate

※予約語のカラム名などがあるので、適宜変更しています。

投稿2021/03/10 00:45

編集2021/03/10 01:18
sazi

総合スコア25199

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

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

player31

2021/03/10 12:13

ご回答ありがとうございます。 大変勉強になりました。 ご回答いただいた内容で試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問