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

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

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

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

SQL

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

Q&A

解決済

1回答

5109閲覧

ACCESS 2013 クロス集計でのGROUP BYの使い方について

anemone1005

総合スコア10

Access

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

SQL

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

0グッド

0クリップ

投稿2015/10/04 06:02

###前提・実現したいこと
Access2013を使って在庫管理システムを作っています。

毎週一回、アイテムの棚卸をしてItemごと、ビル毎の在庫数量を入力しています。

Table 名 T_In/out

ID As of Building Item Qty
35 10/5/2015 A Display (22inch) 77 ← これ
34 10/5/2015 A Display (24inch) 90 ← これ
15 10/5/2015 B Display (24inch) 8 ← これ
14 10/5/2015 B Display (22inch) 60 ← これ
33 10/3/2015 B Display (24inch) 5
32 10/3/2015 B Display (22inch) 50
31 10/3/2015 A Display (24inch) 500
30 10/3/2015 A Display (22inch) 500
22 9/25/2015 B IP Phone 6 ← これ
21 9/25/2015 A IP Phone 90 ← これ

最新の在庫数量をPivotで表示させたく、下記のSQLで実施すると、BuildAは問題ないのですが、BuildingBの数量が最新の日付のものが反映されず困っています。

下記のソースコードを実行した結果

Item Date A B
Display (22inch) 05-Oct-15 77 50(本当は60)
Display (24inch) 05-Oct-15 90 5 (本当は8)
IP Phone (335) 25-Sep-15 90 6

###ソースコード
SQL (Access 2013)

TRANSFORM Last([T_In/out].Qty) AS Date
SELECT [T_In/out].Item, Max([T_In/out].[As of]) AS [Date]
FROM [T_In/out]
GROUP BY [T_In/out].Item
PIVOT [T_In/out].Building;

Access初心者でいろいろと調べてみたのですが解決できずにいます。
どなたかアドバイス頂けると幸いです。

どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

First関数、Last関数の仕様でそうなります。詳細は下記のリンク先を参照してください。
First および Last 関数の仕様
要するにこのような要件では、First関数、Last関数はどのレコードを返すか不定なので使えないということです。

方法としては、Item と ビル でグループ化して日付の最大を取得する集計クエリを作成して、それと元のテーブルを結合したものをクロス集計クエリにします。

Q_MaxDate

SQL

1SELECT [T_In/out].Item, [T_In/out].Building, Max([T_In/out].[As of]) AS [Date] 2FROM [T_In/out] 3GROUP BY [T_In/out].Item, [T_In/out].Building;

QX_In/out

SQL

1TRANSFORM First([T_In/out].Qty) AS FQty 2SELECT Q_MaxDate.Item, Q_MaxDate.Date 3FROM [T_In/out] INNER JOIN Q_MaxDate ON ([T_In/out].Item = Q_MaxDate.Item) AND ([T_In/out].[As of] = Q_MaxDate.[Date]) AND ([T_In/out].Building = Q_MaxDate.Building) 4GROUP BY Q_MaxDate.Item, Q_MaxDate.Date 5PIVOT Q_MaxDate.Building;

2つのクエリになりますが、サブクエリを使えば一つのクエリにすることも可能です。

相関サブクエリを使う方法もありますが重くなりがちです。上記の集計クエリと結合する方法が最速だと思います。

投稿2015/10/04 07:12

hatena19

総合スコア33620

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

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

anemone1005

2015/10/04 12:08

早速のコメントありがとうございます! 頂いたアドバイスで臨んだ結果が得られました。ありがとうございます! いろいろと試していた時に、日付列でMAXをかけていたはず(つもり)なのに、よく見てみたらIDのMAXをとっているようで、はまっていました。 First/Last関数についてもよく調べてみます! またINNER JOINは連結関数?のようなものでしょうか。こちらも初めてなので調べてみます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問