Accessを使って以下のように業務担当者の集計をしたいのですが、どのように
クエリを作成していけばいいのか、よくわかりません。うまい解決がおわかり
の方、ご教授いただけないでしょうか?

個々の業務は一人か二人の担当者で実施します。業務ごとに主担当者IDと副担
当者IDが記録されていますが、副担当者はつかない場合があります。つまり、
次のような感じです。担当者IDは実際は数字で、別の担当者名簿にリンクして
います。現在はID=1を担当なしにしていますが、そのへんはまだいじれます。

[業務担当]
業務 主 副
1  a b
2  a
3  c
4  c b
5  b a
6  a c
7  a b
8  c

ここで、各担当者が、単独で業務を行なった回数、複数担当での主担当者とし
て行なった回数、副担当者として行なった回数、を集計して以下のような結果
を得たいのです。

担当者 単独 主 副
a   1  3 1
b   0  1 3
c   2  1 1

最初は、単独と複数で別々のクエリで抜き出してから、さらに集計のクエリに
かけるのかなとか考えたのですが、これだけのことにそんなに複雑な処理がい
るとも思えません。何かすっきりした解決がありそうなんですが。

よろしくお願いいたします。

A 回答 (2件)

SELECT t.担当者,


(select count(*) from 業務担当 as g where g.主=t.担当者 and g.副 is null) AS 単独,
(select count(*) from 業務担当 as g where g.主=t.担当者 and g.副 is not null) AS 主,
(select count(*) from 業務担当 as g where g.副=t.担当者) AS 副
FROM 担当者 AS t;

こんなかんじでしょうか?
    • good
    • 0
この回答へのお礼

適切な回答ありがとうございます。またお礼が遅くなって申し訳ありません。
しばらく手元で試せる環境を作れなかったもので。

回答をいただいた結果、うまく集計のクエリを作成することができました。
やはりSQLをちゃんと勉強してこれくらい書けるようにならないといけないですね。

で、本当に申し訳ないのですが、もう一点お尋ねしていいでしょうか。
[業務担当]の表には、実際にはその業務日も含まれています。
業務日の範囲を限定して(例えばyyyy/mm/ddからyyyy/mm/dd)、
同じ集計をするには、この集計クエリで、where の中身をいじればいい
というのはわかるのですが、それだと3箇所に同じ記述が必要になりますよね?

まず、[業務担当]の表の中から、該当日だけを抽出して、それを元に集計するには、
一つのSQLでどう書けばいいのでしょう?

あつかましいお願いですが、よろしくお願いいたします。

お礼日時:2002/01/29 13:07

追加の質問に対する答えですが、わたしの知る限りでは、


where句に3回同じ記述をするしかないと思います。
お役に立てず申し訳ありません。
    • good
    • 0
この回答へのお礼

そうでしたか。しかたないですね。
それより、役に立たないなんてとんでもない。
非常に助かりました。ありがとうございます。
今後もよろしくお願いします。

お礼日時:2002/02/04 10:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QphpMyAdminでのフィールド削除(クエリ実行)

本当にMySQL初心者なので基本的にコマンドが理解できないのですが、phpMyAdminにてデータベースを管理していますが、一つのテーブルに数千のデータが入っており、例えばID番号1から500までを一気に削除したいと言うときに、最初はローカルにCSVデータをエキスポートして編集した後インポートさせようとしたのですが、文字コードの関係でエラーになってしまい、解決策はクエリでデータを削除するしかないとの結論になりました。
例えばテーブルを指定してからクエリのウィンドウを開くとSELECT * FROM `テーブル名` WHERE 1
とすでに入力されているのですが、これをどのように書き換えれば複数のフィールドをいっぺんに削除できるのでしょうか?
非常に困ってます、アドバイスよろしくお願いします

Aベストアンサー

普通にクエリを書いて実行してください

DELETE FROM `テーブル名` WHERE `ID` BETWEEN 1 AND 500;

QAccessのクロス集計クエリから、追加クエリをvbaで記述したいが記述が分からない。

Windows7のAccess2007を使っています。
Accessのクロス集計クエリから、追加クエリをvbaで記述したいが記述
が分からない。

vbaを使わなければ、データベースウインドウで最初にクロス集計のク
エリを作って、そのクエリを使って追加クエリを作れば終わりですが。
これと同じ事をvbaで記述をしたいのですが。

出来るのでしょうか。

例として、収穫テーブルとサイズテーブルのクロス集計を作ると仮定し
て下記の構造で作る物とします。
収穫テーブルは下記の構造です。
1. idと言う名前でオートナンバーの型
2. サイズと言う名前で数値の型

サイズテーブルは下記の構造とします。
1. idと言う名前でオートナンバーの型
2. 名前と言うフィールドの名前でテキストの型

収穫のテーブルは下記のデータが入っています。
ID サイズ
1 1
2 2
3 2
4 2
5 1
6 2
7 3

サイズのテーブルは下記のデータが入っています。
ID 名前
1 大
2 中
3 小

リレーションシップは、一側のテーブルがサイズのテーブルで、idを主
キーとします。多側のテーブルは、収穫のテーブルで多側のキーはサイ
ズです。

ここで、クエリ1の名前で
TRANSFORM Count(収穫.ID) AS IDのカウント
SELECT 収穫.ID
FROM サイズ INNER JOIN 収穫 ON サイズ.ID = 収穫.サイズ
GROUP BY 収穫.ID
PIVOT サイズ.名前;

を実行すると、下記が得られます。
ID 小 大 中
1 1
2 1
3 1
4 1
5 1
6 1
7 1

ここで、クエリ1を使って下記のクエリ2を作ります。
INSERT INTO table1
SELECT クエリ1.*
FROM クエリ1;

上記の操作でクエリ1のクロス集計クエリを使って
クエリ2の追加クエリと言う二つの手段で
クロス集計からデータを作る事が出来ます。

この操作をvbaの手法で作る方法は無いのでしょうか。
この例でのコードの記述を宜しくお願いします。

Windows7のAccess2007を使っています。
Accessのクロス集計クエリから、追加クエリをvbaで記述したいが記述
が分からない。

vbaを使わなければ、データベースウインドウで最初にクロス集計のク
エリを作って、そのクエリを使って追加クエリを作れば終わりですが。
これと同じ事をvbaで記述をしたいのですが。

出来るのでしょうか。

例として、収穫テーブルとサイズテーブルのクロス集計を作ると仮定し
て下記の構造で作る物とします。
収穫テーブルは下記の構造です。
1. idと言う名前でオートナ...続きを読む

Aベストアンサー

こちらが参考になるでしょう。
http://www.accessclub.jp/bbs6/0008/das1904.html


おまけ、上記を参考にした
一応動作するコード。

Dim strSQL As String
strSQL = "INSERT INTO table1 " & _
   "SELECT Q.* " & _
   "FROM [" & _
   "TRANSFORM Count(収穫.ID) AS IDのカウント " & _
   "SELECT 収穫.ID " & _
   "FROM サイズ INNER JOIN 収穫 ON サイズ.ID=収穫.サイズ " & _
   "GROUP BY 収穫.ID " & _
   "PIVOT サイズ.名前 " & _
   "IN ('大','中','小')" & _
   "]. As Q"
Debug.Print strSQL
CurrentDb.Execute strSQL

Qアクセスの削除クエリでいいのでしょうか?

 データベースで検索できるようにしたいのですが・・・・。クエリの検索結果をフォームに反映させています。
 検索結果表示後、もう一度検索フォームに戻り、検索をかけたときヒットするデータがないにも関わらず前回の検索結果が表示されたままになってしまいます。
削除クエリを使用すればいいのでしょうか?
 また削除クエリをどのように設定したらいいのでしょうか?(たとえば抽出条件が必要なのでしょうか?)
 この場合、マクロはいったん削除クエリを開き、もう一度クエリを開く設定でいいのでしょうか?分かりにくい質問ですいませんが教えてください

Aベストアンサー

はい、フォームのもとになっているクエリのデータが変わっても、更新行為をしないと反映されません。
具体的には、更新したいフォームに、コマンドボタンウイザードでフォーム→再表示を選択し、「再表示」ボタンを作ってみてください。押すとほら、更新されました。ボタン押し下げ動作を省略したい場合は、たとえば検索画面に戻るボタンがあるとしたら、そのボタンのクリック時イベントに、再表示ボタン内の主要ソースを貼り付ければ用を成すはずです。
但し、サブフォームをご利用の場合など、この方法がふさわしくない場合もあります。
確実に更新するには該当のフォームを閉じて開きなおすことです。マクロを作ってボタン化すれば少々画面がちらつくだけでそう不自然ではありません。
お試し下さい。

Qaccess クエリで集計した数値を別クエリで使いたい

access2003で2000ファイル形式で以下のものを作っています。
テーブル「A」(フィールドは登録番号(主キー)、 書名) 「B」(登録番号(主キー)、 書名) がある。Aの「登録番号の最大値」(100とする)をクエリ(クエリ名「集計クエリ」)で集計して得た。
テーブルBの登録番号(1~30とする)を更新クエリで(1+100 ~ 30+100)に更新したい。そこでデザインビューで登録番号フィールド(テーブルB)の「レコードの更新」欄にビルダーで「[B]![登録番号]+[集計クエリ]![登録番号の最大値]」と入力して実行したら
実行できなかった。(仕方ないので「[B]![登録番号]+100」として実行したら更新できた。)今後もあるので「集計クエリ」で得た値を直接呼んで、更新クエリを実行したいのだが・・・。
わかりにくい質問で恐縮です。ご理解頂けたならば、ご教授ください。

Aベストアンサー

集計クエリは使わずに
[B]![登録番号]+DMax("登録番号","A")
で。
テーブル「A」にデータがない場合も考慮するなら
[B]![登録番号]+Nz(DMax("登録番号","A"),0)

Qテーブル削除クエリ

テーブル作成クエリはあるけどテーブル削除クエリはないのでしょうか?
ADOXで削除するしかないですか?

Aベストアンサー

クエリーのSQLビューで、下記の様なSQLを入力して保存すると、一種のテーブル削除クエリができますね。
DROP TABLE Table1;
データベースウィンドウで右クリックする方が早そうな...
VBAからなら、下記で実行できました。ご参考まで。
Sub Sample()
DoCmd.SetWarnings False
DoCmd.OpenQuery "Q_Table1削除"
DoCmd.SetWarnings True
End Sub

QACCESS VBA EXCEL クエリ 転記 集計 SQL

ACCESSからEXCELへ転記する際に以下のような一定の操作を行いたいと考えています。

ACCESSの中で以下のようなクエリがあります。
名前値段管理番号
雑誌500A1
写真700A2
音楽600A3
ソフト500A4
写真400A5
雑誌500A6
音楽900A7
写真700A8
写真700A9
ソフト500A10
写真700A11

これを通常にEXCELへ貼り付ける時には以下のようなプログラムをVBAにて作成し実行してます。

With wkb.Worksheets(stSheet)

Do Until rst.EOF
'ここに新たな式を書く
.Cells(3+CntGyo,1)=rst![名前]
.Cells(3+CntGyo,2)=rst![値段]
.Cells(3+CntGyo,3)=rst![管理番号]

CntGyo=CntGyo+1
rst.MoveNext
Loop
End With

ここでEXCELに貼り付ける際に以下のようにしたいと考えております。
A列   B列 C列 D列 E列
名前値段個数管理番号 その他の管理番号
雑誌5002A1 A6
写真7003A2 A8,A9,A11
音楽6001A3
ソフト5002A4 A10
写真4001A5
音楽9001A7

名前と値段をグループとして考え、
C列に個数を、D列に管理番号の一番小さい値を示す。
E列にグループ化された管理番号のその他の値を示す。

以上の操作をSQL構文等を使って作れるものなのでしょうか?

ACCESSからEXCELへ転記する際に以下のような一定の操作を行いたいと考えています。

ACCESSの中で以下のようなクエリがあります。
名前値段管理番号
雑誌500A1
写真700A2
音楽600A3
ソフト500A4
写真400A5
雑誌500A6
音楽900A7
写真700A8
写真700A9
ソフト500A10
写真700A11

これを通常にEXCELへ貼り付ける時には以下のようなプログラムをVBAにて作成し実行してます。

With wkb.Worksheets(stSheet)

Do Until rst.EOF
'ここに新たな式を書く
.Cells(3+CntGyo,1)=rst![名前]
.Cells(3+Cn...続きを読む

Aベストアンサー

> 写真 700 3 A2  A8,A9,A11

写真 700 4 A2  A8,A9,A11
ですよね。

単純に管理番号でソートすると上記は
写真 700 4 A11  A2,A8,A9 となるので、
頭にスペース付けて6文字に統一して処理している例となります。
(A2 と A11 では、A11 の方が小さい)
(見難くなってますが、RIGHTの右側にある空白は5文字分の空白です)

(テーブル名は「T_T6」としています)


標準モジュールに以下作成

Public Function KanriNoEtc(sName As String, vPrice As Variant) As String
  Dim rs As New ADODB.Recordset
  Dim sTmp As String
  Dim iCount As Long

  sTmp = ""
  iCount = 0
  rs.Source = "SELECT * FROM T_T6 WHERE [名前]='" & sName & "' AND [値段]=" & vPrice & " ORDER BY RIGHT(' ' & [管理番号],6);"
  rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
  While (Not rs.EOF)
    If (iCount > 0) Then
      sTmp = sTmp & "," & rs("管理番号")
    End If
    iCount = iCount + 1
    rs.MoveNext
  Wend
  If (Len(sTmp) > 0) Then
    sTmp = Mid(sTmp, 2)
  End If
  KanriNoEtc = sTmp
End Function

※ ADOで書いていますがDAOでもお好きな方を


レコードを得るSQL

SELECT T_T6.名前, T_T6.値段, Count(*) AS 個数, Replace(Min(RIGHT(" " & T_T6.管理番号,6))," ","") AS 管理番号, KanriNoEtc(T_T6.名前,T_T6.値段) AS その他の管理番号
FROM T_T6
GROUP BY T_T6.名前, T_T6.値段
ORDER BY Min(RIGHT(" " & T_T6.管理番号,6));

※ 単純に確認するのであれば、クエリのSQLビューに張り付けて
※ データ量が多くなると遅いと思います


組み込む時には、現Excel処理前に行っていたレコード抽出部を上記に変更し

.Cells(3+CntGyo,1)=rst![名前]
.Cells(3+CntGyo,2)=rst![値段]
.Cells(3+CntGyo,3)=rst![個数]
.Cells(3+CntGyo,4)=rst![管理番号]
.Cells(3+CntGyo,5)=rst![その他の管理番号]

とします。

> 写真 700 3 A2  A8,A9,A11

写真 700 4 A2  A8,A9,A11
ですよね。

単純に管理番号でソートすると上記は
写真 700 4 A11  A2,A8,A9 となるので、
頭にスペース付けて6文字に統一して処理している例となります。
(A2 と A11 では、A11 の方が小さい)
(見難くなってますが、RIGHTの右側にある空白は5文字分の空白です)

(テーブル名は「T_T6」としています)


標準モジュールに以下作成

Public Function KanriNoEtc(sName As String, vPrice As Variant) As String
  Dim rs ...続きを読む

QAccessの削除クエリについて

『先月分のデータを全て削除』という削除クエリを作りたいのです。
本を見ても、
『指定した日の○日前の分までのデータを削除する』はあるのですが・・・・。

例えば、
5月5日にクエリを実行しても、5月10日にクエリを実行しても、4月30日以前のデータが削除されて欲しいのですが。
よろしくお願いいたします。

Aベストアンサー

>『先月分のデータを全て削除』
ということであれば下記条件で削除クエリを作成
すればできます。
---
フィールド:式:Month([対象日付フィールド])
抽出条件:Month(DateAdd("m",-1,Now()))

QAccess クロス集計クエリについて

お世話になります。

クロス集計クエリの結果が以下の内容になっているとします。

項目   2013年10月  2014年07月  2014年08月  2014年09月
商品数  100        150       120        130
顧客数  2000       2200      2100       2200
※2013年11月~2014年6月までのデータ無し

上記クエリで、データの無い期間の商品数及び顧客数を0とし、また見出しも
埋めたいところです。

項目   2013年10月  2013年11月 ・・・2014年08月  2014年09月
商品数  100        0         120        130
顧客数  2000       0         2100       2200

このように表示したい場合、やはり元データにレコードを作成し各数量は0で
登録しなければなりませんでしょうか。
それとも、実際にレコードが無くても、上記表示は可能でしょうか。

************
当該クエリの内容は最終的にExcelファイルに貼り付けします。
現状、左詰めで貼り付けられてしまう為、可能であれば1年分の
体裁を整えた状態で貼り付けしたいところです。


ご教示の程、宜しくお願い致します。

お世話になります。

クロス集計クエリの結果が以下の内容になっているとします。

項目   2013年10月  2014年07月  2014年08月  2014年09月
商品数  100        150       120        130
顧客数  2000       2200      2100       2200
※2013年11月~2014年6月までのデータ無し

上記クエリで、データの無い期間の商品数及び顧客数を0とし、また見出しも
埋めたいところです。

項目   2013年10月  2013年11月 ・・・2014年08月  2014年09月
...続きを読む

Aベストアンサー

【補足の補足】

色々とテストした結果、列[年月]がテキスト型の場合には、In句が自動生成されませんね。日付型ですと、自動生成されるのですが・・・。

PIVOT [年月日] In ("2014年01月","2014年02月","2014年03月","2014年04月","2014年05月");

そして、テキスト型に限っては、このような書き方でも「型の不一致エラー」はでないようです。

In句を自動生成させるのか否か?

ちょっと、検討事項かもしれませんね。

Qアクセスのクエリでレコード削除ができません。

アクセス超初心者です。

テーブルを商品コードでくっつけて、クエリのデザインビューで表示しました。

いらないレコードを削除しようとしたところ、できません。

くっつける前の、テーブルではできますが、クエリで実行させ、レコードを削除しようとしたところできません。

どうしたらよいのか教えてください。

あと、もうひとつ、クエリで、出力したいフィールド名をドラッグしたあと、削除したいときには、どうすればよいでしょうか?

表示しないなら、できるのですが・・・。削除がわかりません。

よろしくお願いいたします。

Aベストアンサー

二つのテーブル構造が不明
クエリのSQL文も不明
サンプルデータ

以上三点が分からないと回答のしようもありません。
SQL文はクエリをデザインビューで開いて
その上で右クリックすると現れるコンテキストメニューに
SQLビュー が有りますので切り替えると
SELECT ・・・・ てのが有りますのでコピーして此処に貼り付けできます。

クエリはSQL文を分かりやすいように作られたモノで実体はSQL文です。
掲示板ではこのSQL文でやり取りをします。
さて、なぜ削除できないかというと、そのように作ってしまっているからです。
このリンク先の説明を理解すれば原因が突き止められます。
クエリのデータを編集できない状況
http://office.microsoft.com/ja-jp/access-help/HA010097876.aspx

フィールドの削除は、Access2010の場合なら
リボンの中に「列の削除」が有ります。
または、フィールド名の少し上にマウスカーソルを持って行くと
下向きの太い矢印になるのでクリック、列全体が反転しますので Deleteキーで削除
なお、次回からはAccessのバージョンも明記しましょう。

二つのテーブル構造が不明
クエリのSQL文も不明
サンプルデータ

以上三点が分からないと回答のしようもありません。
SQL文はクエリをデザインビューで開いて
その上で右クリックすると現れるコンテキストメニューに
SQLビュー が有りますので切り替えると
SELECT ・・・・ てのが有りますのでコピーして此処に貼り付けできます。

クエリはSQL文を分かりやすいように作られたモノで実体はSQL文です。
掲示板ではこのSQL文でやり取りをします。
さて、なぜ削除できないかというと、そのように作ってしまっているか...続きを読む

Qアクセス2010 クロス集計クエリの列見出し

お世話になります。
クロス集計クエリの列見出しが、商品名にできずにコードになってしまいます!

先日こちらで、列見出しがコードの場合はクエリ列見出しに商品名で固定しようとしても空白になることを教えて頂きました。

ですが、列見出しがコードのままだと都合が悪い為、どうしても列見出しを商品名にしたくて考えているのですが、どうしてもできません・・

テーブル『販売実績』 フィールド[ID][販売日]・[店舗]・[担当者]
テーブル 『販売明細』 フィールド[ID]・[販売実績ID]・[部門]・[商品名]・[商品カラー]・[販売金額]・[販売本数のカウント]
という二つのテーブルから[販売明細]をサブフォームにするフォームを作ってそこから入力ができるようにしています。(クエリもこの2つのテーブルから作って、クロス集計にしています。)

フォームの[部門]・[商品名]・[商品カラー]はコンボボックスから選択できるようにしており、まず部門を選択するとそれに伴って商品名が絞り込まれて、さらに商品名から商品カラーが絞り込まれるようなコンボボックスにしています。

ここで、コンボボックスの商品名を、商品IDではなく商品名でテーブルに取得したいと思い、(それができれば列見出しも商品名にできると思い)、連結列を2にしてみると、テーブルには商品名で入ったんですが、今度はフォームの絞り込みのコンボボックスが使えなくなりました。

部門から商品名の絞り込みはできるんですが、商品名から商品カラーの絞り込みができなくなりました。
多分連結列を2にしたので、コンボボックスの値がIDから商品名になった為にIDで抽出していたものができなくなった為だと思うんですが、どうにかできないものかと考えているんですがどうにもできません。

この列見出しに商品名を持ってくるということだけで、かなり時間を食ってしまいました。
何か解決策ありましたらご教授ください。

宜しくお願いします。
何分初心者なもので、説明が的外れでしたら申し訳ありません。

お世話になります。
クロス集計クエリの列見出しが、商品名にできずにコードになってしまいます!

先日こちらで、列見出しがコードの場合はクエリ列見出しに商品名で固定しようとしても空白になることを教えて頂きました。

ですが、列見出しがコードのままだと都合が悪い為、どうしても列見出しを商品名にしたくて考えているのですが、どうしてもできません・・

テーブル『販売実績』 フィールド[ID][販売日]・[店舗]・[担当者]
テーブル 『販売明細』 フィールド[ID]・[販売実績ID]・[部門]・[商品...続きを読む

Aベストアンサー

今は列見出しが商品IDになってると思います。そのフィールド名は変更できますので、そこを商品名にしてみてください。
おそらく、それでいけると思います。


人気Q&Aランキング

おすすめ情報