Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


254 / 2272 ツリー ←次へ | 前へ→

【12365】テーブル同士で値の変更 ナナパパ 13/7/2(火) 20:12 質問[未読]
【12366】Re:テーブル同士で値の変更 かるびの 13/7/3(水) 1:25 回答[未読]
【12367】Re:テーブル同士で値の変更 ナナパパ 13/7/3(水) 18:24 質問[未読]
【12368】Re:テーブル同士で値の変更 かるびの 13/7/4(木) 2:16 回答[未読]
【12369】Re:テーブル同士で値の変更 ナナパパ 13/7/4(木) 11:13 質問[未読]
【12370】Re:テーブル同士で値の変更 ナナパパ 13/7/4(木) 11:49 質問[未読]
【12371】Re:テーブル同士で値の変更 ナナパパ 13/7/4(木) 14:24 お礼[未読]
【12372】Re:テーブル同士で値の変更 ナナパパ 13/7/4(木) 17:36 質問[未読]
【12373】Re:テーブル同士で値の変更 かるびの 13/7/4(木) 20:45 回答[未読]
【12374】Re:テーブル同士で値の変更 ナナパパ 13/7/4(木) 21:23 質問[未読]
【12380】Re:テーブル同士で値の変更 かるびの 13/7/7(日) 15:49 回答[未読]
【12382】Re:テーブル同士で値の変更 ナナパパ 13/7/9(火) 9:39 質問[未読]
【12385】Re:テーブル同士で値の変更 ナナパパ 13/7/9(火) 21:02 質問[未読]
【12386】Re:テーブル同士で値の変更 かるびの 13/7/10(水) 1:25 回答[未読]
【12388】Re:テーブル同士で値の変更 ナナパパ 13/7/11(木) 17:46 質問[未読]
【12389】Re:テーブル同士で値の変更 かるびの 13/7/12(金) 1:42 回答[未読]
【12390】Re:テーブル同士で値の変更 ナナパパ 13/7/12(金) 9:41 質問[未読]
【12391】Re:テーブル同士で値の変更 かるびの 13/7/16(火) 3:25 回答[未読]
【12397】Re:テーブル同士で値の変更 ナナパパ 13/7/19(金) 18:41 質問[未読]
【12398】Re:テーブル同士で値の変更 かるびの 13/7/20(土) 2:48 回答[未読]
【12399】Re:テーブル同士で値の変更 かるびの 13/7/21(日) 14:26 回答[未読]

【12365】テーブル同士で値の変更
質問  ナナパパ  - 13/7/2(火) 20:12 -

引用なし
パスワード
   お世話になります

access2003です。
二つのテーブルを比較して名称変更をselect文で
表示させたいのですが方法がわかりません

氏名テーブル
ID |名前|会社名
1 |太郎|太郎建設
2 |二郎|二郎建設
3 |一郎|一郎建設
4 |三郎|三郎建設

会社名称変換テーブル
ID|変更前 |変更後 
1 |一郎建設|太郎建設
2 |二郎建設|太郎建設

結果クエリ
名前|会社名
太郎|太郎建設
二郎|太郎建設
一郎|太郎建設
三郎|三郎建設

わかる方ご教授いただければ幸いです。

【12366】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/3(水) 1:25 -

引用なし
パスワード
   方法1 

 SELECT T1.名前
    ,IIF(IsNull(T2.変更後)=True
      ,T1.会社名
      ,T2.変更後
      ) AS 社名
 FROM 氏名 AS T1
   LEFT JOIN 会社名称変換 AS T2
   ON T1.会社名=T2.変更前

方法2

 SELECT T1.名前
    ,T1.会社名
 FROM 氏名 AS T1
   LEFT JOIN 会社名称変換 AS T2
   ON T1.会社名=T2.変更前
 WHERE T2.変更後 Is Null
 UNION ALL
 SELECT T3.名前
    ,T4.変更後
 FROM 氏名 AS T3
   INNER JOIN 会社名称変換 AS T4
   ON T3.会社名=T4.変更前

 でも、どっちの方が速いんだろうか。
 方法1だと、IIF関数を使う点で遅そうだし、
方法2だと、抽出条件で Is Null を使う点で遅くなりそうだし、
また、ユニオンクエリだという点で時間が余計にかかりそうだし。


 なお、従来の氏名テーブルを分けて、
   「名前」テーブル
      名前ID  長整数型又はオートナンバー型(主キー)
      名前   テキスト型
      会社ID  長整数型
   「会社名」テーブル
      会社ID  長整数型又はオートナンバー型(主キー)
      会社名  テキスト型
というテーブル構成にした方がデータベース的です。
 会社名の変更があった場合も、
「会社名」テーブルの「会社名」フィールドの値を書き替えれば済むので、
対応しやすくなります。

【12367】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/3(水) 18:24 -

引用なし
パスワード
   ▼かるびの さん:
>方法1 
>
> SELECT T1.名前
>    ,IIF(IsNull(T2.変更後)=True
>      ,T1.会社名
>      ,T2.変更後
>      ) AS 社名
> FROM 氏名 AS T1
>   LEFT JOIN 会社名称変換 AS T2
>   ON T1.会社名=T2.変更前
>
>方法2
>
> SELECT T1.名前
>    ,T1.会社名
> FROM 氏名 AS T1
>   LEFT JOIN 会社名称変換 AS T2
>   ON T1.会社名=T2.変更前
> WHERE T2.変更後 Is Null
> UNION ALL
> SELECT T3.名前
>    ,T4.変更後
> FROM 氏名 AS T3
>   INNER JOIN 会社名称変換 AS T4
>   ON T3.会社名=T4.変更前
>
> でも、どっちの方が速いんだろうか。
> 方法1だと、IIF関数を使う点で遅そうだし、
>方法2だと、抽出条件で Is Null を使う点で遅くなりそうだし、
>また、ユニオンクエリだという点で時間が余計にかかりそうだし。
>
>
> なお、従来の氏名テーブルを分けて、
>   「名前」テーブル
>      名前ID  長整数型又はオートナンバー型(主キー)
>      名前   テキスト型
>      会社ID  長整数型
>   「会社名」テーブル
>      会社ID  長整数型又はオートナンバー型(主キー)
>      会社名  テキスト型
>というテーブル構成にした方がデータベース的です。
> 会社名の変更があった場合も、
>「会社名」テーブルの「会社名」フィールドの値を書き替えれば済むので、
>対応しやすくなります。


お世話になります
方法1を採用させて頂きたく
設定しましたが
エラーも無く変換も無く
表示されました。。

もう少しご教授頂ければ幸いです

【12368】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/4(木) 2:16 -

引用なし
パスワード
    私の前回回答は、サンプルを作って実験してみることなく回答したものでした。
そこで、今回サンプルを作って実験してみました。
 ちゃんと希望どおりのクエリになりました。

>方法1を採用させて頂きたく
>設定しましたが
とのことですが、ちゃんとクエリのSQLビューにSQL文を書きましたか。

【12369】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/4(木) 11:13 -

引用なし
パスワード
   ▼かるびの さん:
> 私の前回回答は、サンプルを作って実験してみることなく回答したものでした。
>そこで、今回サンプルを作って実験してみました。
> ちゃんと希望どおりのクエリになりました。
>
>>方法1を採用させて頂きたく
>>設定しましたが
>とのことですが、ちゃんとクエリのSQLビューにSQL文を書きましたか。


再確認させてください
自分でやったことを報告します

【テーブル名】氏名
ID(オートナンバー)主キー|名前(テキスト型)|会社名(テキスト型)


【テーブル名】会社名称変換
ID(オートナンバー)主キー|変更前(テキスト型)|変更後(テキスト型)

【結果クエリ】
SELECT T1.名前,IIF(IsNull(T2.変更後)=True,T1.会社名,T2.変更後) AS 社名
FROM 氏名 AS T1 LEFT JOIN 会社名称変換 AS T2 ON T1.会社名=T2.変更前

上記方法で設定したにもかかわらず結果が得られません
何度も申し訳ありません

【12370】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/4(木) 11:49 -

引用なし
パスワード
   ▼かるびの さん:
> 私の前回回答は、サンプルを作って実験してみることなく回答したものでした。
>そこで、今回サンプルを作って実験してみました。
> ちゃんと希望どおりのクエリになりました。
>
>>方法1を採用させて頂きたく
>>設定しましたが
>とのことですが、ちゃんとクエリのSQLビューにSQL文を書きましたか。

同様のテーブルでユニオンクエリも試したところ結果は同じでした

結果クエリ2
SELECT T1.名前, T1.会社名 FROM 氏名 AS T1 LEFT JOIN 会社名称変換 AS T2 ON T1.会社名=T2.変更前
WHERE T2.変更後 Is Null
UNION ALL
SELECT T3.名前,T4.変更後 FROM 氏名 AS T3 INNER JOIN 会社名称変換 AS T4 ON T3.会社名=T4.変更前;

【12371】Re:テーブル同士で値の変更
お礼  ナナパパ  - 13/7/4(木) 14:24 -

引用なし
パスワード
   ▼かるびの さん:
> 私の前回回答は、サンプルを作って実験してみることなく回答したものでした。
>そこで、今回サンプルを作って実験してみました。
> ちゃんと希望どおりのクエリになりました。
>
>>方法1を採用させて頂きたく
>>設定しましたが
>とのことですが、ちゃんとクエリのSQLビューにSQL文を書きましたか。


できました
すみません 勘違いしてました
名前に対して変更前、変更後を入れてました。
本当にすみません

実装までして頂きご教授有難う御座います

【12372】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/4(木) 17:36 -

引用なし
パスワード
   ▼かるびの さん:
>方法1 
>
> SELECT T1.名前
>    ,IIF(IsNull(T2.変更後)=True
>      ,T1.会社名
>      ,T2.変更後
>      ) AS 社名
> FROM 氏名 AS T1
>   LEFT JOIN 会社名称変換 AS T2
>   ON T1.会社名=T2.変更前
>
>方法2
>
> SELECT T1.名前
>    ,T1.会社名
> FROM 氏名 AS T1
>   LEFT JOIN 会社名称変換 AS T2
>   ON T1.会社名=T2.変更前
> WHERE T2.変更後 Is Null
> UNION ALL
> SELECT T3.名前
>    ,T4.変更後
> FROM 氏名 AS T3
>   INNER JOIN 会社名称変換 AS T4
>   ON T3.会社名=T4.変更前
>
> でも、どっちの方が速いんだろうか。
> 方法1だと、IIF関数を使う点で遅そうだし、
>方法2だと、抽出条件で Is Null を使う点で遅くなりそうだし、
>また、ユニオンクエリだという点で時間が余計にかかりそうだし。
>
>
> なお、従来の氏名テーブルを分けて、
>   「名前」テーブル
>      名前ID  長整数型又はオートナンバー型(主キー)
>      名前   テキスト型
>      会社ID  長整数型
>   「会社名」テーブル
>      会社ID  長整数型又はオートナンバー型(主キー)
>      会社名  テキスト型
>というテーブル構成にした方がデータベース的です。
> 会社名の変更があった場合も、
>「会社名」テーブルの「会社名」フィールドの値を書き替えれば済むので、
>対応しやすくなります。


書いてなかったですが件数も置き換えしたいのですが
氏名テーブル
ID |名前|会社名 |件数
1 |太郎|太郎建設|100
2 |二郎|二郎建設|300
3 |一郎|一郎建設|10
4 |三郎|三郎建設|20

会社名称変換テーブル
ID|変更前 |変更後 
1 |一郎建設|太郎建設
2 |二郎建設|太郎建設

現在の結果クエリ
|会社名 |件数
|太郎建設|410
|三郎建設|20

希望の結果クエリ
|会社名 |件数
|太郎建設|100
|三郎建設|20

何度も申し訳ありませんが
ご教授頂ければ幸いです

【12373】Re:テーブル同士で値の変更
回答  かるびの E-MAIL  - 13/7/4(木) 20:45 -

引用なし
パスワード
   >希望の結果クエリ
>|会社名 |件数
>|太郎建設|100
>|三郎建設|20

 これは、どういうことをやりたいんですか。
 
   SELECT 会社名,件数
   FROM 氏名
   WHERE ID = 1 OR ID = 4
というクエリを実行すれば、上記の結果になりますが、
「IDが1又は4であるレコード」なんていう抽出条件では、おそらく意味を成しませんよね。


>氏名テーブル
>ID |名前|会社名 |件数
>1 |太郎|太郎建設|100
>2 |二郎|二郎建設|300
>3 |一郎|一郎建設|10
>4 |三郎|三郎建設|20
 さらに、氏名テーブルに「件数」フィールドがあるというのは、かなり理解しがたいです。
 件数は人の属性である、
つまり、時期がいつであるかにかかわらず、人が決まれば件数が決まる
というものなのであれば、氏名テーブルに件数フィールドを持たせてもいいと思いますが、
おそらく、件数は、人が同じでも、時期が違えば件数が変わるというものなのでしょうから、
件数は、別のテーブルに持たせるべきです。
 「テーブルの正規化」ということを考えてみてください。

 テーブルが正規化されていないと、無駄に複雑なクエリやVBAを組むことになりますし、
その場合、コンピュータの処理速度も遅くなるし、
BBSで質問しようとしてももなかなか回答がつかないし、
いいことは何もないです。

 「テーブルの正規化」についての詳しいことは、ネットで検索してください。
 私も正確なところはよくわかっていませんが、
極めて大雑把に言うと、コンピュータにとって使いやすいようにテーブルを分けることです。
そして、正規化されたテーブルは人間にとっては見づらいです。

【12374】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/4(木) 21:23 -

引用なし
パスワード
   ▼かるびの さん:
>>希望の結果クエリ
>>|会社名 |件数
>>|太郎建設|100
>>|三郎建設|20
>
> これは、どういうことをやりたいんですか。
> 
>   SELECT 会社名,件数
>   FROM 氏名
>   WHERE ID = 1 OR ID = 4
>というクエリを実行すれば、上記の結果になりますが、
>「IDが1又は4であるレコード」なんていう抽出条件では、おそらく意味を成しませんよね。
>
>
>>氏名テーブル
>>ID |名前|会社名 |件数
>>1 |太郎|太郎建設|100
>>2 |二郎|二郎建設|300
>>3 |一郎|一郎建設|10
>>4 |三郎|三郎建設|20
> さらに、氏名テーブルに「件数」フィールドがあるというのは、かなり理解しがたいです。
> 件数は人の属性である、
>つまり、時期がいつであるかにかかわらず、人が決まれば件数が決まる
>というものなのであれば、氏名テーブルに件数フィールドを持たせてもいいと思いますが、
>おそらく、件数は、人が同じでも、時期が違えば件数が変わるというものなのでしょうから、
>件数は、別のテーブルに持たせるべきです。
> 「テーブルの正規化」ということを考えてみてください。
>
> テーブルが正規化されていないと、無駄に複雑なクエリやVBAを組むことになりますし、
>その場合、コンピュータの処理速度も遅くなるし、
>BBSで質問しようとしてももなかなか回答がつかないし、
>いいことは何もないです。
>
> 「テーブルの正規化」についての詳しいことは、ネットで検索してください。
> 私も正確なところはよくわかっていませんが、
>極めて大雑把に言うと、コンピュータにとって使いやすいようにテーブルを分けることです。
>そして、正規化されたテーブルは人間にとっては見づらいです。


お返事有難うございます
> これは、どういうことをやりたいんですか。
大変申し訳ないです
テーブルは例題です
本当のフィールド名は違います

氏名テーブル(元の名前です)
ID|支払コード|金額
1 |A0001   |300
2 |B0002   |400
3 |C0003   |1
4 |C0003   |500
5 |A0001   |300
上記のように置き返れば解りやすかったかもしれません


会社名称変換テーブル(元の名前です)
ID|変更前|変更後|
1 |C0003 |A0001
本来支払をしなければならないコードに対して

結果クエリ
支払コード|金額|
B0002   |400
C0003   |500
支払コードと金額を変更させたい

色々なご指摘有難うございます
テーブルの正規化は
名前程度ですが存知上げています
これを機会に勉強させて頂きたいと思います

ほぼ上記に近テーブル状態です
分ける必要ありますか?

質問に対して混乱を招いてしまって申し訳ありません

【12380】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/7(日) 15:49 -

引用なし
パスワード
   >氏名テーブル(元の名前です)
>ID|支払コード|金額
>1 |A0001   |300
>2 |B0002   |400
>3 |C0003   |1
>4 |C0003   |500
>5 |A0001   |300
 こういうテーブルであれば、金額フィールドを別テーブルに分ける必要はありません。


>結果クエリ
>支払コード|金額|
>B0002   |400
>C0003   |500
>支払コードと金額を変更させたい

 このクエリですが、どういうクエリなんでしょうか。
 【12372】からすれば、氏名テーブルを元にして、支払コードでグループ化して
金額の合計を出す集計クエリのように思えますが、
他方で、氏名テーブルのIDが2であるレコードとIDが4であるレコードを抽出した
選択クエリとも思えます。

 また、支払コードと金額を変更させたいということですが、
何から何に変更したいというのでしょうか。
  
 【12372】を見ると、現在の結果クエリはとりあえずできあがっているようですが、
希望する結果クエリの内容によっては、
現在の結果クエリをベースにして新たにクエリを作るのではなく、
現在の結果クエリ自体を見直す必要もあると思います。

【12382】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/9(火) 9:39 -

引用なし
パスワード
   ▼かるびの さん:
>>氏名テーブル(元の名前です)
>>ID|支払コード|金額
>>1 |A0001   |300
>>2 |B0002   |400
>>3 |C0003   |1
>>4 |C0003   |500
>>5 |A0001   |300
> こういうテーブルであれば、金額フィールドを別テーブルに分ける必要はありません。
>
>
>>結果クエリ
>>支払コード|金額|
>>B0002   |400
>>C0003   |500
>>支払コードと金額を変更させたい
>
> このクエリですが、どういうクエリなんでしょうか。
> 【12372】からすれば、氏名テーブルを元にして、支払コードでグループ化して
>金額の合計を出す集計クエリのように思えますが、
>他方で、氏名テーブルのIDが2であるレコードとIDが4であるレコードを抽出した
>選択クエリとも思えます。
>
> また、支払コードと金額を変更させたいということですが、
>何から何に変更したいというのでしょうか。
>  
> 【12372】を見ると、現在の結果クエリはとりあえずできあがっているようですが、
>希望する結果クエリの内容によっては、
>現在の結果クエリをベースにして新たにクエリを作るのではなく、
>現在の結果クエリ自体を見直す必要もあると思います。


お返事有難う御座います
IDは関係ありません

なぜこういった事を実現させたいのか?
請負った支払コード、金額=請負費に対して
外注払いする際別の支払いコード、金額を使いたい為(振替)です
上記の理由から
変更前の支払コード、金額から
変更後の支払コード、金額へ振り替えたい

最終はグループ化させ合計するつもりです

【12385】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/9(火) 21:02 -

引用なし
パスワード
   ▼かるびの さん:
>>氏名テーブル(元の名前です)
>>ID|支払コード|金額
>>1 |A0001   |300
>>2 |B0002   |400
>>3 |C0003   |1
>>4 |C0003   |500
>>5 |A0001   |300
> こういうテーブルであれば、金額フィールドを別テーブルに分ける必要はありません。
>
>
>>結果クエリ
>>支払コード|金額|
>>B0002   |400
>>C0003   |500
>>支払コードと金額を変更させたい
>
> このクエリですが、どういうクエリなんでしょうか。
> 【12372】からすれば、氏名テーブルを元にして、支払コードでグループ化して
>金額の合計を出す集計クエリのように思えますが、
>他方で、氏名テーブルのIDが2であるレコードとIDが4であるレコードを抽出した
>選択クエリとも思えます。
>
> また、支払コードと金額を変更させたいということですが、
>何から何に変更したいというのでしょうか。
>  
> 【12372】を見ると、現在の結果クエリはとりあえずできあがっているようですが、
>希望する結果クエリの内容によっては、
>現在の結果クエリをベースにして新たにクエリを作るのではなく、
>現在の結果クエリ自体を見直す必要もあると思います。


すみません読み違えてました
又、結果クエリが間違えてます

結果クエリ
A0001   |600
B0002   |400


大分悩み続け少し分けて考えてみました
1.変更前に入力されている支払コードと金額は結果を出さない
2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)

こうすると解決されるはずですが
お示頂いたSQL文に1.を追加する際はどうすればよいですか?

【12386】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/10(水) 1:25 -

引用なし
パスワード
   >>なぜこういった事を実現させたいのか?
>>請負った支払コード、金額=請負費に対して
>>外注払いする際別の支払いコード、金額を使いたい為(振替)です
 単純に考えると、「氏名」テーブルに「請負時支払コード」、
「請負費」というフィールドを
新たに設ければいいように思いますが、それではダメなんでしょうか。


 それはさておき、
>1.変更前に入力されている支払コードと金額は結果を出さない
>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)

>こうすると解決されるはずですが
>お示頂いたSQL文に1.を追加する際はどうすればよいですか?


>>>>氏名テーブル(元の名前です)
>>>>ID|支払コード|金額
>>>>1 |A0001   |300
>>>>2 |B0002   |400
>>>>3 |C0003   |1
>>>>4 |C0003   |500
>>>>5 |A0001   |300
 このテーブルから変更前に入力されたレコードか、
変更後に入力されたレコードかを識別することはできません。
 それを識別するためには、
変更前の入力か、変更後の入力がわかるためのフィールドを設ける必要が
あります。
 おそらく、「入力日時」という日付時刻型のフィールドを設けることに
なるのでしょう。

 また、変更がいつあったのかということもわからないと、
変更前か変更後かを識別できません。
したがって、「会社名称変換」テーブルにも
「変更日時」という日付時刻型のフィールドを設けることになると思います。

 変更日時は、氏名テーブルのレコードごとに取得する必要があるので、
相関サブクエリを使うことになると思います。
 次のクエリは、氏名テーブルと会社名称変換テーブルの双方にレコードがあり、
かつ、変更後のレコードを返します。
  SELECT 支払コード, 金額
  FROM 氏名テーブル AS T1
    INNER JOIN 会社名称変換テーブル AS T2
    ON T1.支払コード=T2.変更前
  WHERE 入力日時>=
    (
    SELECT 変更日時
    FROM 会社名称変換 AS T3
    WHERE T2.ID=T3.ID
    );

 最終的なSQL文がどのようなものになるのかは何とも言えませんが、
会社名称変換テーブルにレコードがあるものとないものとをユニオンさせる
ユニオンクエリになりそうな気がします。

【12388】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/11(木) 17:46 -

引用なし
パスワード
   ▼かるびの さん:
>>>なぜこういった事を実現させたいのか?
>>>請負った支払コード、金額=請負費に対して
>>>外注払いする際別の支払いコード、金額を使いたい為(振替)です
> 単純に考えると、「氏名」テーブルに「請負時支払コード」、
>「請負費」というフィールドを
>新たに設ければいいように思いますが、それではダメなんでしょうか。
>
>
> それはさておき、
>>1.変更前に入力されている支払コードと金額は結果を出さない
>>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
>
>>こうすると解決されるはずですが
>>お示頂いたSQL文に1.を追加する際はどうすればよいですか?
>
>
>>>>>氏名テーブル(元の名前です)
>>>>>ID|支払コード|金額
>>>>>1 |A0001   |300
>>>>>2 |B0002   |400
>>>>>3 |C0003   |1
>>>>>4 |C0003   |500
>>>>>5 |A0001   |300
> このテーブルから変更前に入力されたレコードか、
>変更後に入力されたレコードかを識別することはできません。
> それを識別するためには、
>変更前の入力か、変更後の入力がわかるためのフィールドを設ける必要が
>あります。
> おそらく、「入力日時」という日付時刻型のフィールドを設けることに
>なるのでしょう。
>
> また、変更がいつあったのかということもわからないと、
>変更前か変更後かを識別できません。
>したがって、「会社名称変換」テーブルにも
>「変更日時」という日付時刻型のフィールドを設けることになると思います。
>
> 変更日時は、氏名テーブルのレコードごとに取得する必要があるので、
>相関サブクエリを使うことになると思います。
> 次のクエリは、氏名テーブルと会社名称変換テーブルの双方にレコードがあり、
>かつ、変更後のレコードを返します。
>  SELECT 支払コード, 金額
>  FROM 氏名テーブル AS T1
>    INNER JOIN 会社名称変換テーブル AS T2
>    ON T1.支払コード=T2.変更前
>  WHERE 入力日時>=
>    (
>    SELECT 変更日時
>    FROM 会社名称変換 AS T3
>    WHERE T2.ID=T3.ID
>    );
>
> 最終的なSQL文がどのようなものになるのかは何とも言えませんが、
>会社名称変換テーブルにレコードがあるものとないものとをユニオンさせる
>ユニオンクエリになりそうな気がします。


お返事ありがとうございます


1.変更前に入力されている支払コードと金額は結果を出さない
(2つのテーブルから条件に一致しないデータ抽出)
2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)

ググったら1についてはできました
URL貼り付けは禁止のようなのでSQL文を貼り付けます
SELECT * FROM 氏名 AS M left outer join 会社名称変換 AS S ON M.名前 = S.変更前
where S.変更前 is null
ただ1と2を組み合わせるにはどうしたらいいのか・・・

【12389】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/12(金) 1:42 -

引用なし
パスワード
   >1.変更前に入力されている支払コードと金額は結果を出さない
>(2つのテーブルから条件に一致しないデータ抽出)
>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
 勘違いしていました。
 私は、ここで言っている「変更前」というのは、
支払コードを変更しようという時点よりも前、
つまり、会社名称変換テーブル入力時より前という意味だと取ったのですが、
会社名称変換テーブルにおける「変更前」フィールドという意味だったのですね。
 失礼しました。


>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
 これって、結局、クエリにどのフィールドを表示させるかということだと思います。
 SQL文のSELECT句にフィールド名を書いてあげれば、
書いたフィールドだけがクエリに表示されます。

【12390】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/12(金) 9:41 -

引用なし
パスワード
   ▼かるびの さん:
>>1.変更前に入力されている支払コードと金額は結果を出さない
>>(2つのテーブルから条件に一致しないデータ抽出)
>>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
> 勘違いしていました。
> 私は、ここで言っている「変更前」というのは、
>支払コードを変更しようという時点よりも前、
>つまり、会社名称変換テーブル入力時より前という意味だと取ったのですが、
>会社名称変換テーブルにおける「変更前」フィールドという意味だったのですね。
> 失礼しました。
>
>
>>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
> これって、結局、クエリにどのフィールドを表示させるかということだと思います。
> SQL文のSELECT句にフィールド名を書いてあげれば、
>書いたフィールドだけがクエリに表示されます。


なんどもすみません

1、実現できていること2つのテーブルから条件に一致しないデータ抽出
SELECT M.名前, M.会社名, S.変更前
FROM 氏名 AS M LEFT JOIN 会社名称変換 AS S ON M.名前 = S.変更前
WHERE (((S.変更前) Is Null));

2、実現できていること名称変換
SELECT T1.名前, IIf(IsNull(T2.変更後)=True,T1.会社名,T2.変更後) AS 社名
FROM 氏名 AS T1 LEFT JOIN 会社名称変換 AS T2 ON T1.会社名 = T2.変更前;

これを組み合わせるにはどうすればいいですか?

なんども実験をしてるのですがだめです

【12391】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/16(火) 3:25 -

引用なし
パスワード
    これまでのところを整理してみたいと思います。

 どういうクエリを作りたいのかということが伝わっていません。

 これまでに示されたのは、
>>>氏名テーブル(元の名前です)
>>>ID|支払コード|金額
>>>1 |A0001   |300
>>>2 |B0002   |400
>>>3 |C0003   |1
>>>4 |C0003   |500
>>>5 |A0001   |300
というテーブルと
>>>会社名称変換テーブル(元の名前です)
>>>ID|変更前|変更後|
>>>1 |C0003 |A0001
というテーブルをベースにして、
>>>結果クエリ
>>>A0001   |600
>>>B0002   |400
というクエリを作りたいということですよね。
 そして、この結果クエリは、
>>>1.変更前に入力されている支払コードと金額は結果を出さない
>>>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
ということですね。

 
 これらを踏まえて質問です。
 第1に、支払コードに関して、結果クエリで表示させたいフィールドは、
計3つのフィールドのうち、どのテーブルの何というフィールドですか。
なお、これは、作りたいクエリのSELECT句の問題です。
 第2に、結果クエリの第2フィールドの値は、
氏名テーブルのどのフィールドについて、どのような集計を行った値なのですか。
これも、作りたいクエリのSELECT句の問題です。
 第3に、それらのフィールドを表示させるためには、
どのテーブルを使う必要がありますか。
なお、これは、結果クエリのFROM句の問題です。
 第4に、
>SELECT M.名前, M.会社名, S.変更前
>FROM 氏名 AS M LEFT JOIN 会社名称変換 AS S ON M.名前 = S.変更前
>WHERE (((S.変更前) Is Null));
というクエリが不一致クエリと呼ばれるクエリであることはわかっていますか。
また、不一致クエリというのがどういうレコードを抽出するクエリかということは
わかっていますか。
 第5に、結果クエリにおける集計対象に、
氏名テーブルにおけるIDが1であるレコードと
IDが5であるレコードとが含まれるのは、
どういう抽出条件あるいは結合条件を設けるからですか。
 第6に、結果クエリという集計クエリにおいて、
氏名テーブルにおけるIDが3であるレコードとIDが4であるレコードとが
集計対象から除外されるのはどういう抽出条件あるいは結合条件を設けるからですか。
 第7に、結果クエリという集計クエリにおいて、
氏名テーブルにおけるIDが2であるレコードが集計対象に含まれるのは
どういう抽出条件あるいは結合条件を設けるからですか。
 第8に、第5〜7の質問を踏まえてですが、
結果クエリにおいては、どのような抽出条件を設定したいのですか。

 これらのうちには、これまでのやり取りで答えが出ている質問もありますが、
改めて、文章で考えてみてください。
 文章で表現できれば、自ずとSQL文が見えてくるはずです。

【12397】Re:テーブル同士で値の変更
質問  ナナパパ  - 13/7/19(金) 18:41 -

引用なし
パスワード
   ▼かるびの さん:
> これまでのところを整理してみたいと思います。
>
> どういうクエリを作りたいのかということが伝わっていません。
>
> これまでに示されたのは、
>>>>氏名テーブル(元の名前です)
>>>>ID|支払コード|金額
>>>>1 |A0001   |300
>>>>2 |B0002   |400
>>>>3 |C0003   |1
>>>>4 |C0003   |500
>>>>5 |A0001   |300
>というテーブルと
>>>>会社名称変換テーブル(元の名前です)
>>>>ID|変更前|変更後|
>>>>1 |C0003 |A0001
>というテーブルをベースにして、
>>>>結果クエリ
>>>>A0001   |600
>>>>B0002   |400
>というクエリを作りたいということですよね。
> そして、この結果クエリは、
>>>>1.変更前に入力されている支払コードと金額は結果を出さない
>>>>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
>ということですね。
>
> 
> これらを踏まえて質問です。
> 第1に、支払コードに関して、結果クエリで表示させたいフィールドは、
>計3つのフィールドのうち、どのテーブルの何というフィールドですか。
>なお、これは、作りたいクエリのSELECT句の問題です。
表示させたいのは氏名テーブルの支払コードです

> 第2に、結果クエリの第2フィールドの値は、
>氏名テーブルのどのフィールドについて、どのような集計を行った値なのですか。
>これも、作りたいクエリのSELECT句の問題です。
グループアップさせて金額は合計させています

> 第3に、それらのフィールドを表示させるためには、
>どのテーブルを使う必要がありますか。
>なお、これは、結果クエリのFROM句の問題です。
氏名テーブルと会社名称変換テーブルです

> 第4に、
>>SELECT M.名前, M.会社名, S.変更前
>>FROM 氏名 AS M LEFT JOIN 会社名称変換 AS S ON M.名前 = S.変更前
>>WHERE (((S.変更前) Is Null));
>というクエリが不一致クエリと呼ばれるクエリであることはわかっていますか。
>また、不一致クエリというのがどういうレコードを抽出するクエリかということは
>わかっていますか。
はい存じ上げています

> 第5に、結果クエリにおける集計対象に、
>氏名テーブルにおけるIDが1であるレコードと
>IDが5であるレコードとが含まれるのは、
>どういう抽出条件あるいは結合条件を設けるからですか。
コードが重複してる件?に関しては伝票番号だと思っていただければ
納得いただけると・・・


> 第6に、結果クエリという集計クエリにおいて、
>氏名テーブルにおけるIDが3であるレコードとIDが4であるレコードとが
>集計対象から除外されるのはどういう抽出条件あるいは結合条件を設けるからですか。
会社名称変換テーブルの変更前にあるコードが一致すれば結果クエリには表示させないとしたいからです

> 第7に、結果クエリという集計クエリにおいて、
>氏名テーブルにおけるIDが2であるレコードが集計対象に含まれるのは
>どういう抽出条件あるいは結合条件を設けるからですか。
会社名称変換テーブルの変更前フィールドのC0003をはぶいて
合計させた結果になります


> 第8に、第5〜7の質問を踏まえてですが、
>結果クエリにおいては、どのような抽出条件を設定したいのですか。
>

1.変更前に入力されている支払コードと金額は結果を出さない
2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)


> これらのうちには、これまでのやり取りで答えが出ている質問もありますが、
>改めて、文章で考えてみてください。
> 文章で表現できれば、自ずとSQL文が見えてくるはずです。


1、解決済み
SELECT M.名前, M.会社名, S.変更前
FROM 氏名 AS M LEFT JOIN 会社名称変換 AS S ON M.名前 = S.変更前
WHERE (((S.変更前) Is Null));

2、解決済み
SELECT T1.名前, IIf(IsNull(T2.変更後)=True,T1.会社名,T2.変更後) AS 社名
FROM 氏名 AS T1 LEFT JOIN 会社名称変換 AS T2 ON T1.名前 = T2.変更前;
これらをうまく組み合わせれば実現しそうなんですが
なんどやってもわかりません

【12398】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/20(土) 2:48 -

引用なし
パスワード
   >> 第1に、支払コードに関して、結果クエリで表示させたいフィールドは、
>>計3つのフィールドのうち、どのテーブルの何というフィールドですか。
>>なお、これは、作りたいクエリのSELECT句の問題です。
>表示させたいのは氏名テーブルの支払コードです
 したがって、SQL文のSELECT句は、
   SELECT 氏名テーブル.支払コード
となります。

>> 第2に、結果クエリの第2フィールドの値は、
>>氏名テーブルのどのフィールドについて、どのような集計を行った値なのですか。
>>これも、作りたいクエリのSELECT句の問題です。
>グループアップさせて金額は合計させています
 作りたいクエリは、集計クエリということですね。
 SQL文のSELECT句は
   SELECT 氏名テーブル.支払コード
         ,Sum(氏名テーブル.金額)
となります。

 また、GROUP BY句に「氏名テーブル」の「支払コード」フィールドを指定する必要があります。
 集計クエリにおいて、集計を行うフィールド以外のフィールドを表示したい場合、
表示したいフィールドをGROUP BY句に書く必要があります。
 もっとも、GROUP BY句の本来の意味は、指定したフィールドでグループ化が行われること
なので、むやみにGROUP BY句に書くわけにはいきませんが。
    

>> 第5に、結果クエリにおける集計対象に、
>>氏名テーブルにおけるIDが1であるレコードと
>>IDが5であるレコードとが含まれるのは、
>>どういう抽出条件あるいは結合条件を設けるからですか。
>コードが重複してる件?に関しては伝票番号だと思っていただければ
>納得いただけると・・・
>> 第6に、結果クエリという集計クエリにおいて、
>>氏名テーブルにおけるIDが3であるレコードとIDが4であるレコードとが
>>集計対象から除外されるのはどういう抽出条件あるいは結合条件を設けるからですか。
>会社名称変換テーブルの変更前にあるコードが一致すれば結果クエリには表示させないとしたいからです
>> 第7に、結果クエリという集計クエリにおいて、
>>氏名テーブルにおけるIDが2であるレコードが集計対象に含まれるのは
>>どういう抽出条件あるいは結合条件を設けるからですか。
>会社名称変換テーブルの変更前フィールドのC0003をはぶいて
>合計させた結果になります
 「会社名称変換テーブル」の「変更前」フィールドに値があるものは、
集計対象から除外するということですね。
 つまり、集計対象は、「会社名称変換テーブル」の「変更前」フィールドに値がないもの
とするということですね。
 そして、これが抽出条件だということですね。
 そうすると、WHERE句は、
   WHERE 会社名称変換.変更前 Is Null
となります。


 最後に、FROM句についてですが、
 「変更前」フィールドに値がないものを集計するのだから、
集計対象には、「氏名テーブル」の全レコードを含める必要があります。
 したがって、「氏名テーブル」と「会社名称変換テーブル」は、左外部結合をさせます。
 結合フィールドは、「氏名テーブル」の「支払コード」フィールドと
「会社名称変換テーブル」の「変更前」フィールドとなります。

 今回は、2つのテーブルの結合の仕方が、どのようなレコードを抽出したいかということと
関係すると思ったので、FROM句を最後に説明しましたが、
SQL文を書くときには「まずFROM句から書け。SELECT句はその後だ」と言う人もいます。
取り入れてもいいアドヴァイスだと思います。


>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
 結果クエリにおいて表示したいフィールドは、「氏名テーブルの支払コード」なんでしたよね。
 このことを前提とすれば、支払コードの振替えという事態はあり得ないんですけど。


 ここからは、ちょっと系統が異なるアドヴァイスになりますが、
クエリを作るときは、頭の中でSQL文をあれこれ考えるよりは、
全レコード、全フィールドが表示されたクエリを見て、
「このフィールドはいらない」、「このレコードはいらない」とかなどと考え、
それを元にSELECT句やWHERE句を考えた方が、考えがまとまりやすいことがあります。
  SELECT T1.ID,T1.支払コード,T1.金額,T2.ID,T2.変更前,T2.変更後
  FROM 氏名 AS T1
    LEFT JOIN 会社名称変換 AS T2
    ON T1.支払コード = T2.変更前;
というクエリを表示させてみて、SELECT句やWHERE句をどうするか考えてみたらどうでしょうか。

【12399】Re:テーブル同士で値の変更
回答  かるびの  - 13/7/21(日) 14:26 -

引用なし
パスワード
   >1、解決済み
>SELECT M.名前, M.会社名, S.変更前
>FROM 氏名 AS M LEFT JOIN 会社名称変換 AS S ON M.名前 = S.変更前
>WHERE (((S.変更前) Is Null));
>2、解決済み
>SELECT T1.名前, IIf(IsNull(T2.変更後)=True,T1.会社名,T2.変更後) AS 社名
>FROM 氏名 AS T1 LEFT JOIN 会社名称変換 AS T2 ON T1.名前 = T2.変更前;
>これらをうまく組み合わせれば実現しそうなんですが
>なんどやってもわかりません
 上記の2つのクエリは、FROM句が同じなので、
あとは、SELECT句とWHERE句を適宜指定してやるだけです。
 例えば、
  SELECT T1.ID
     ,IIf(IsNull(T2.変更後)=True,T1.支払コード,T2.変更後) AS 新コード
     ,T1.金額
  FROM 氏名 AS T1
    LEFT JOIN 会社名称変換 AS T2
    ON T1.支払コード = T2.変更前
  WHERE T2.変更前 Is Null;
です。
 このSQL文だと、

T1.ID|新コード|金額
 1 |A0001  |300
 2 |B0002  |400
 5 |A0001  |300

というクエリになります。このクエリをベースにした集計クエリを作ってやれば、

結果クエリ
A0001   |600
B0002   |400

というクエリを得られます。


>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
についてですが、上記のSQL文だと、
「変更前」フィールドに値のあるレコードはWHERE句によって除外されるので、
支払コードの振替が生じるようなレコードは返されません。
 もし、
>2.変更前から変更後に入力されている物は支払コードのみ振返る(解決)
というレコードも抽出したいのであれば、
抽出条件をよくよく考え直す必要があります。

254 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078191
(SS)C-BOARD v3.8 is Free