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

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

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

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

SQL

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

Q&A

解決済

3回答

18110閲覧

複数条件で集計を行いたい

f-hanako

総合スコア159

Access

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

SQL

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

0グッド

0クリップ

投稿2015/09/09 04:32

SQL初心者です。
Access2013を使用して開発を行っております。
ファイルの拡張子は「.mdb(2002 -2003 ファイル形式)」です。

以下のようなテーブルがあります。
一時間ごとに回数を集計しております。

【test_table】
[ID] [日付] [時間] [カテゴリ] [個数]
01 20150909 00 1 10
01 20150909 00 2 5
01 20150909 01 1 10
01 20150909 02 1 10
……
01 20150909 21 1 10
01 20150909 22 1 5
01 20150909 22 2 10
01 20150909 23 1 10

このテーブルのデータに対して
ID、日付、カテゴリごとに、ある時間範囲で個数の集計を行いたいと思っております。

[ID] [日付] [カテゴリ] [昼間集計(09-18)] [夜間集計(19-08)]
01 20150909 1 120 250
01 20150909 2 100 25

以下のようなクエリを作成してみました。

SQL

1SELECT ID, 日付, 2 (SELECT SUM(個数) WHERE ID='01' AND 日付='20150909' 3 AND ('09'<= 時間 AND 時間 <='18')AS 昼間集計(09-18), 4(SELECT SUM(個数) WHERE ID='01' AND 日付='20150909' 5 AND (('00'<= 時間 AND 時間 <='08') OR ('19'<= 時間 AND 時間 <='23') )AS 夜間集計, 6FROM test_table 7GROUP BY ID, 日付, カテゴリ

求める結果は抽出されましたが、SQL自体が長くなってしまい、
もっと短くできないかと思い質問させていただきました。

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

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

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

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

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

guest

回答3

0

AcccessだとTRANSFORM(クロス集計クエリ)を使うとシンプルになります。

SQL

1TRANSFORM Sum(個数) 2SELECT ID, 日付, カテゴリ 3FROM test_table 4WHERE ID="01" AND 日付="20150909" 5GROUP BY ID, 日付, カテゴリ 6PIVOT IIf(時間 Between "09" And "18","昼間集計(09-18)","夜間集計(19-08)");

ちなみに、前の回答者さんのコードの IFF は IIF のタイプミスですね。

投稿2015/09/12 04:09

hatena19

総合スコア33699

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

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

f-hanako

2015/09/16 01:42

返信が遅くなってしまい申し訳ありません。 回答ありがとうございました。 TRANSFORM句は初めて見ました!便利な機能ですね。 実際にSQLを実行し、求める結果が出力されました。 しかし、後から個数以外にも集計する項目が増えてしまったため、 他でクロス集計が必要なときに使用してみます。 (調べてみると、一つの項目に対してしか使用できないようなので……。) ありがとうございました!
hirohiro

2015/09/16 05:13

IIFのご指摘ありがとうございます。投稿修正しました。おはずかしい
guest

0

初めまして。
access vba を使用できるのなら、何度も出てくるものを変数として持たせてしまうのはいかがでしょうか?
その方が読みやすくなりますよ。
また、蛇足ではありますが、業務で利用していた時にANDやWHERE といったキーワードで改行をしていました。
WHERE a = 0 AND b = 0

WHERE a = 0
AND b = 0
という具合です。
参考になれば幸いです。

投稿2015/09/09 10:26

kpiyohiko

総合スコア658

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

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

f-hanako

2015/09/16 01:44

返信が遅くなってしまい申し訳ありません。 回答ありがとうございました。 繰り返し出てくる時間の範囲を変数として持つことにしました。 おかげで短く記述することが出来ました。 改行箇所も参考にしたいと思います。 ありがとうございました!
guest

0

ベストアンサー

SQLは縦に並んでいたものを横にするのが苦手なのであまりスマートにはいきませんが、次のようなコードではどうでしょうか?

SQL

1SELECT ID,日付,カテゴリ 2 ,SUM( IIF(('09'<= 時間 AND 時間 <='18'),個数,0) ) AS 昼間集計(09-18) 3 ,SUM( IIF(('09'<= 時間 AND 時間 <='18'),0,個数) ) AS 夜間集計 4FROM test_table 5WHERE ID='01' AND 日付='20150909' 6GROUP BY ID, 日付, カテゴリ

※2015/09/16 IFF->IIFに修正
Accessが手元に無いので動作確認はしていません。

投稿2015/09/09 09:09

編集2015/09/16 05:14
hirohiro

総合スコア2068

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

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

f-hanako

2015/09/16 01:47

返信が遅くなってしまい申し訳ありません。 回答ありがとうございました。 SQLの中にIIF関数を組み込むことができるのですね。大変助かりました。 おかげで初めより短いSQL文を完成させることが出来ました。 今回のベストアンサーとさせていただきます。 ありがとうございました!
hirohiro

2015/09/16 05:12

うぉ、IFF->IIFの間違いですね。 修正しておきました。すみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問