条件指定の特定レコードのフィールド値の差をとりたい
- テーブル1とテーブル2の特定レコードのフィールド値の差を計算する方法について教えてください。
- 差をとりたいレコードは、テーブル2の期間1と期間2の範囲に含まれるテーブル1のレコードだけです。
- テーブル1のデータ1とテーブル2のデータ2の差を求め、結果をテーブル1に反映させたいです。なお、差はマイナスになることはありません。
- ベストアンサー
条件指定の特定レコードのフィールド値の差をとりたい
お世話になります。 テーブル1(TBL_1)の社員コードそれぞれにおけるレコードのフィールド値のデータ1と別テーブル(TBL_2)のデータ2との差をとる方法が知りたいです。差をとりたいレコードは以下の条件によります。 ・テーブル2の期間1と期間2の範囲にはいっているテーブル1のレコードのみ差をとる。 ・データ1とデータ2の差がマイナス(-)になることはありません。 ・社員コードは百程度、レコード数は数千にのぼります。 ・フィールドの期間1と期間2は同一社員コードにおいて重複することはありません。 ・テーブル2(TBL_2)は年度をまたいでの期間設定は基本しません。年度をまたぐ場合はレコードを増やします。 テーブル1名:TBL_1 社員コード 期間1 期間2 データ1 00123 2012/6/30 2014/3/31 30 00123 2014/4/1 2015/3/31 100 00456 1995/9/15 2008/3/31 15 00789 2001/6/2 2013/3/31 224 ・ 00456 2008/4/1 2016/3/31 628 ・ 00789 2013/4/1 2015/3/31 1089 ・ 00123 2015/4/1 2017/3/31 95 ・ テーブル2名:TBL_2 社員コード 期間1 期間2 データ2 00123 2012/11/6 2013/3/31 5 00123 2013/4/1 2013/11/5 13 00456 2013/6/12 2013/10/6 22 00789 1995/6/7 2000/2/11 6 具体的には、上記例においてテーブル1を下記の結果にしたいです。 テーブル1名:TBL_1 社員コード 期間1 期間2 データ1 00123 2012/6/30 2014/3/31 12 ←30-(5+13)=12 00123 2014/4/1 2015/3/31 100 ←変わらない 00456 1995/9/15 2008/3/31 15 ←変わらない 00789 2001/6/2 2013/3/31 224 ←変わらない ・ 00456 2008/4/1 2016/3/31 606 ←628-22=606 ・ 00789 2013/4/1 2015/3/31 1089 ←変わらない ・ 00123 2015/4/1 2017/3/31 95 ←変わらない ・ なにとぞお力添えをお願い致します。
- vesper580109
- お礼率80% (55/68)
- その他MS Office製品
- 回答数4
- ありがとう数3
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
【Where節を修正したDSum()バージョン!】 DLookup()、DSum()のどちらを利用するのかは好みの問題。 SELECT 社員コード, 期間1, 期間2, データ1, DSUM("データ2","TBL_2","社員コード=" & [社員コード] & " AND 期間1 >= #" & [期間1] & "# AND 期間2 <= #" & [期間2] & "#") AS データ2 FROM TBL_1;
その他の回答 (3)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【訂正】 × 期間1 BETWEEN #" & [期間1] & "# AND #" & [期間2] & "#" この条件文を目的に沿って書き直す必要があります。アップしてから「アレレッ!」と気付いた次第です。どのように書き直すのかは説明するまでもないので割愛します。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Access であれば DLookup() を使えば簡単に目的を達成できますよ。 SELECT TBL_1.社員コード, TBL_1.期間1, TBL_1.期間2, TBL_1.データ1, Val(DBLookup("SELECT SUM(データ2) FROM TBL_2 WHERE 社員コード=" & [社員コード] & " AND 期間1 BETWEEN #" & [期間1] & "# AND #" & [期間2] & "#",0)) AS データ2 FROM TBL_1; ここでは、自作関数のDBLookup()を利用しています。しかし、働きは DLookup()と同じです。DLookup()よりADOで自作した方が、SQL文をそのまま書けるし、3倍速で動きます。でも、今はPCの性能も高いのでその必要はないかもです。 で、ともかく DLookup() を使えば簡単に目的を達成できますよ。
お礼
f_a_007さん ご回答ありがとうございました。 DLookupでできるとのことで、発想ができませんでした。 またWHERE句がなかなか理解できておらず、自身で難しく考え 過ぎているのかもしれません。 まずはお礼申し上げます。
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは Accessですよね? クエリ作成してSQLビューで SELECT TBL_1.社員コード, TBL_1.期間1, TBL_1.期間2, IIf([Q_1]![社員コード] Is Null,[TBL_1]![データ1],[TBL_1]![データ1]-[Q_1]![データ2の合計]) AS 式1 FROM TBL_1 LEFT JOIN (SELECT TBL_1.社員コード, TBL_1.期間1, TBL_1.期間2, Sum(TBL_2.[データ2]) AS データ2の合計 FROM TBL_1 INNER JOIN TBL_2 ON TBL_1.社員コード = TBL_2.社員コード WHERE (((TBL_2.期間1)>=[TBL_1]![期間1]) AND ((TBL_2.期間2)<=[TBL_1]![期間2])) GROUP BY TBL_1.社員コード, TBL_1.期間1, TBL_1.期間2) AS Q_1 ON (TBL_1.期間2 = [Q_1].期間2) AND (TBL_1.期間1 = [Q_1].期間1) AND (TBL_1.社員コード = [Q_1].社員コード); とか。
お礼
ushi2015さん ご回答ありがとうございました。 SQLはまだ勉強できておらず、頂いた内容をSQLビューに書き実行したら 得たい結果が得られました。 社員コード、期間1、期間2がリレーションでつながるのは理解できました。 特にWHERE句がなかなか理解できず、苦慮しておりますが、読み解いてみます。 ありがとうございました。
関連するQ&A
- 更新クエリでの抽出条件の設定がわかりません
お世話になります。 Access2010を使っています。 今、TBL_1の社員コードの中で、期間2の日付を、TBL_2の日付フィールドの 値に置換したいです。 TBL_1はIDをオートナンバーで振っており、置換したいレコードは社員コードID値が最大の レコード内の期間2フィールドになります。TBL_2は全社員コードはなく、社員 コードがある場合のみTBL_1の期間2を置換します。 テーブル1名:TBL_1 ID 社員コード 期間1 期間2 1 00123 2012/6/30 2014/3/31 2 00123 2014/4/1 2015/3/31 3 00456 1995/9/15 2008/3/31 4 00789 2001/6/2 2013/3/31 ・ 10 00456 2008/4/1 2016/3/31 ・ 30 00789 2013/4/1 2015/3/31 ・ 50 00123 2015/4/1 2017/3/31 ・ テーブル2名:TBL_2 社員コード 日付 00123 2016/10/31 00456 2015/5/20 上の例では結果として、 IDが10のレコードの期間2を2015/5/20に置換します。 IDが50のレコードの期間2を2016/10/31に置換します。 テーブル1名:TBL_1 ID 社員コード 期間1 期間2 1 00123 2012/6/30 2014/3/31 ←変わらない 2 00123 2014/4/1 2015/3/31 ←変わらない 3 00456 1995/9/15 2008/3/31 ←変わらない 4 00789 2001/6/2 2013/3/31 ←変わらない ・ 10 00456 2008/4/1 2015/5/20 ←期間2:2015/5/20に ・ 30 00789 2013/4/1 2015/3/31 ←変わらない ・ 50 00123 2015/4/1 2016/10/31 ←期間2:2016/10/31に 更新クエリを使えばいいと思っていますが、抽出条件をどのように 書いていいのかわかりません。 恐れ入りますが、宜しくお願い申し上げます。
- ベストアンサー
- その他MS Office製品
- アクセスで複数フィールドを結合して1フィールドを作る際
こんにちは。 OSはWIN2KでAccess2000を使用しております。 「T_データ」テーブルには、 社員コード(数値型)、社員名(テキスト型)、 給料(数値型)、住所(テキスト型)フィールドがあります。 この4つのフィールドを以下の条件を満たしつつ 「T_結合」テーブルの「結合データ」フィールドという 一つのフィールド(テキスト型)に追加したいのです。 ------------------------------------------------ 1.社員コードは 5桁、社員名は半角30桁、 給料は10桁、住所は全角20桁。 2.社員コード、給料は右詰とし残りは0で、 社員名、住所は左詰とし、残りは空白("")で埋める。 ------------------------------------------------- 最終的に「T_結合」テーブルを1レコード85バイトの レコードとしてエクスポートするのが目標です。 アクセスはUnicodeで管理されているというので単純には いかなそうなので、どなたかご教授願います。
- ベストアンサー
- オフィス系ソフト
- 【MYSQL】フィールド名の変更(半角→全角)について
フィールド名の変更(半角→全角)について ただいまmysqlを勉強中の初心者なのですが、 入門書を見ながら試験的に作ったテーブルのフィールド名を変更しようとしています。 テーブル名 tbl_employee 元フィールド名 「code」 型 varchar(40) 新フィールド名 「社員コード」 型 varchar(40) ALTER TABLE tbl_employee CHANGE code '社員コード' VARCHAR(40); とか ALTER TABLE tbl_employee CHANGE code 社員コード VARCHAR(40); とか ALTER TABLE tbl_employee CHANGE code '社員コード'; とか ALTER TABLE tbl_employee CHANGE code 社員コード; とか 一通り試してみたのですが動かず… ちなみに「社員コード」ではなく半角で「syain_code」という名前に変更することは出来ました。 全角文字だけがシンタックスエラーになります。 何が原因か分かる方いらっしゃいましたら教えてくださいませ。 よろしくお願いします。
- ベストアンサー
- MySQL
- Access データの年度更新について
いつも大変お世話なっております。Accessを始めて2週間の初心者です。 今、テーブルにレコードを追加していき、下記のような処理を行いたいのですが どのように構築したらいいのかわかりません。質問の仕方もうまくないので恐縮です。 どのようにというのは、例えばクエリの作り方もそうですし、クエリのためのテーブルを 作らなければ実現できない・・等、イメージが沸きません。 社員コード(社員CD)と資格名の過去の履歴のテーブル(TBL_資格期間一覧)があります。 社員No(社員数)は数百、また資格名の過去履歴は各社員によって異なるのでレコード数 は個々に異なります。 社員CD 期間開始 期間終了 資格名 001234 2004/07/01 2008/03/31 S4 001234 2009/04/01 2016/03/31 S3 001234 2016/04/01 2017/03/31 S2 056789 2010/04/01 2012/03/31 T6 056789 2012/04/01 2014/03/31 T5 056789 2014/04/01 2015/03/31 T4 056789 2015/04/01 2017/03/31 T3 ・ ・ ・ ・ 次年度、001234さんはS2からS1に昇格した場合 001234 2017/04/01 2018/03/31 S1 が追加される。 次年度、056789さんはT3のまま変わらない場合 期間終了フィールドが次年度末に更新され、2018/3/31になる。 結果、TBL_資格期間一覧を下記のようにしたいと思っています。 社員CD 期間開始 期間終了 資格名 001234 2004/07/01 2008/03/31 S4 001234 2009/04/01 2016/03/31 S3 001234 2016/04/01 2017/03/31 S2 056789 2010/04/01 2012/03/31 T6 056789 2012/04/01 2014/03/31 T5 056789 2014/04/01 2015/03/31 T4 056789 2015/04/01 2018/03/31 T3 ←更新される 001234 2017/04/01 2018/03/31 S1 ←追加される ・ ・ ・ ・ TBL_資格期間一覧を開いて、全社員分をマニュアルで日付を入力していく、レコードを追加 していくといった工数をかけられないので、 (1)資格変更のない社員は、自動で更新される (2)資格変更のある社員は、TBL_資格変更 に社員CDと資格名を入れることで レコードが 追加される といった処理をさせたいと思っています。 お力添えいただけないでしょうか? 宜しくお願い致します。
- 締切済み
- その他MS Office製品
- フォーム内のテキストボックスに複数レコードを表示
いつも大変お世話なっております。Accessを始めて3週間の初心者です。 今、社員の在籍中の職級推移を残すための社員明細フォームを作成しています。 社員数数百名。 フォーム名:社員明細 テーブル名:TBL_職級期間一覧 テーブルには 以下のようなレコードが並んでいます。 IDはオートナンバー型を振っています。 年度が替わって、職級が変化すればレコードが追加されます。 (ID 586のように001234 さんのレコードが追加) ID 社員No 開始 終了 職級名 1 001234 2004/04/01 2008/03/31 S3 2 001234 2008/04/01 2012/03/31 S2 3 001234 2012/04/01 2015/03/31 S1 4 005678 1998/04/01 2003/03/31 T6 5 005678 2003/04/01 2005/03/31 T5 6 005678 2005/04/01 2013/03/31 T4 7 005678 2013/04/01 2016/03/31 T3 ・ ・ ・ 586 001234 2015/04/01 2016/03/31 K5 これらを添付写真のようにフォームに表示させる方法がわかりません。 IDを振ったのは社員Noで絞り込み、昇順・降順で表示させる順番を 推移の新しい順、古い順に可変させられるのでは・・?と思ったので IDフィールドを付けました。 いろいろ検索し=DLOOKUPを使ったりと試してみましたが、よくわかり ませんでした。 何卒お力添えをお願い致します。
- ベストアンサー
- その他MS Office製品
- 2つのフィールドの値が同じレコードをひとつと見なす
id field1 field2 1 1 A 2 1 A 3 1 B 4 2 A 5 2 B 6 2 C 7 3 D 8 3 D 9 3 D field1とfield2の値が他のレコードのfield1とfield2と重複している場合はひとつのデータとして返したいです。 id1.2はfield1とfield2の値が同じなので、ひとつのデータしか返しませんが、id3はfield2が異なるので返します。 id4.5.6はいずれもfield2の値が異なるので4.5.6全てを返します。 id7.8.9はfield1とfield2が同じ値なのでひとつのデータしか返しません。 id 1 3 4 5 6 7 該当するレコードは上記のように6個となるようにするにはどのようなsql文を発行すれば良いでしょうか? ご教示頂けますと幸いです。 宜しくお願い致します。
- ベストアンサー
- MySQL
- accessフィールドの複数結合
テーブルAの1つのフィールドとテーブルB内の複数のフィールドを結合させたい。例 テーブルAには社員コードと社員名、テーブルBには商品名、納入社員コード、商品管理社員コード。テーブルAの社員コードフィールドとテーブルBの2つの社員コードフィールドを結合させたいのです。テーブルAをコピーして2つ作り、それぞれをBの2つのフィールドと結合すると出来るのですが、テーブルAが社員名でなく、画像だったりするととても大きなファイルサイズになってしまいます。お答えお待ちしています。
- ベストアンサー
- オフィス系ソフト
- 特定のフィールドの文字列を取得
初心者ですがよろしくお願い致します。 □わからない事 ・特定のフィールドの文字列を取得 ・取得した文字列を配列に格納 □条件 ・mysqlにはすでにデータが登録済み ・PHPより操作 □具体例 フィールド名(hogehoge)に文字列が入っています。 AAAAAA(10000レコード) BBBBBB(5000レコード) CCCCCC(3000レコード) DDDDDD(1000レコード) ・・・・・・(・・・・レコード) 重複が多数ありますが、重複しない文字列だけを取り出して配列に格納したいと思っていますが、うまいやり方がわかりません。 どなたか教えて頂けませんか? よろしくお願い致します。
- ベストアンサー
- MySQL
- ACCESSでコピーしたレコードのフィールド置換作業の繰返しを簡素化したいです
ACCESS2000を使っています。テーブルには必ず「Nenndo」というフィールド名(数値型十新型)で西暦4桁が入力されています。(このフィールドはキーにもインデックスにもなってません)たとえば、 T_M001テーブルのNendoフィールドに2007が入力されたレコードが340件 T_M002テーブルのNendoフィールドに2004が入力されたレコードが823件 こんな感じでNendoフィールドがあるテーブルが沢山あります。 これらのテーブルのNendoフィールドに格納されているレコードをコピー置換作業して2004から2008までのデータを作成したいです。 T_M001であれば2007が入力されてるレコードをコピーして、貼付たレコードNendoフィールドの2007を2004へ置換、また2007のレコードをコピーして2005へを繰り返の作業してます。レコード数は340件が1360件増えて1700件。 テーブルが沢山あって作業に苦慮してます。 ACCESSのモジュールでもマクロでも構いませんので対応策等ご教授願います。
- 締切済み
- オフィス系ソフト
- テーブル同士で持っている同一フィールドの計算(条件つき)
こんばんは。金曜日は大変お世話になりまして有難うございました!勤務中にどうしても解決しなくてはならなかったので本当に助かりました<(_ _)> そして現在ですが、新たに下記の問題に直面しております。お手すきの時で構いませんので、どうぞご教授をお願い致します。 【存在しているテーブル】 A.立替金テーブル(a/b/c/d/e)←フィールド数5 B.預り金テーブル(a/b/c/d/e)←フィールド数5 【やりたい事】 1)A.とB.のテーブルそれぞれで持っているb(商品名)とe(金額)のフィールドを比較し、両方のフィールドが一致したレコードのみ、立替金テーブルから引っ張って表示する。 2)A.とB.のテーブルそれぞれで持っているb(商品名)とe(金額)のフィールドを比較し、両方のフィールドが不一致したレコードに関しては計算が必要。 パターンは「立替金テーブルで持っているb(商品名)のe(金額)数字が、預り金のe(金額)数字とは異なる」というものです。 この場合、やりたいことは、下記の通りです。 それぞれのテーブルでb(商品名)が同じもの同士、e(金額)を加算し、立替金テーブルのeから、預り金テーブルのeをマイナスし、立替金テーブルから該当するレコードを引っ張り、最後にfフィールド(計算結果の数字を入れるフィールド)を新規に作成、付け足しをしてファイル出力したい。 SQLの記述で構いませんので、どうぞ宜しくお願い致します。 PS:ごめんなさい…。あれこれやっていて疲れてしまって説明が、更に頭の回転が鈍くて、うまく出来ていないかも…。
- ベストアンサー
- その他(データベース)
お礼
f_a_007さん 追加ご回答ありがとうございました。 やはり・・私にはまだまだWHERE句のハードルが超えられません。 条件を書いているだけなのですが・・。 本当にありがとうございます。もっと勉強していきます。