• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESS SQLでの重複値の制御)

ACCESS SQLでの重複値の制御

このQ&Aのポイント
  • ACCESSを利用して簡易的なシステムを構築しております。複数テーブルからデータ抽出しているのですが、重複している列の表示のみを制御したいと考えています。
  • 同一商品で複数回の仕入が発生するため、同じ商品CD、商品名称が複数回表示されてしまいます。見た目的に最初の1度のみ表示するよう制御したいです。
  • 質問文章では、ACCESS SQLを使用して重複値の制御についての問題が説明されています。複数テーブルからデータを抽出し、同じ商品CD、商品名称が重複して表示されるため、その制御方法についての質問です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

>この関数を標準モジュールに追加します。 もちろん、クエリに組み込まなくても同じことは可能。 フォームに追加したテキストボックスのプロパティを設定。 それだけでもOKです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

回答No.6

補足:Rename関数だけでもOK! 先の回答は応用されるのに問題があるかも・・・。 そこで、もう少し簡便なやり方を考えてみました。 Option Compare Database Public intCount As Integer Function Rename(newName As String) As String   Static nowName As String   Dim strReturn As String   intCount = intCount + 1   If StrComp(nowName, newName, 0) <> 0 Or intCount = 2 Then     nowName = newName     strReturn = nowName   Else   strReturn = " 〃"   End If   Rename = strReturn End Function この関数を標準モジュールに追加します。 【クエリB】 SELECT Rename([GoodsName]) AS Hinmei,     テーブル1.ID,     テーブル1.GoodsName FROM テーブル1; このクエリを元に帳票フォームを作成します。 【フォームの仕掛け】 Option Compare Database Option Explicit Private Sub Form_Load()   intCount = 0 End Sub このフォームは添付写真のように表示されます。 【お願い】更なる改善を! 確かに、Rename関数で目的は達成されます。が、どうにも広域変数intCountを利用している点がいただけません。できれば、この点の改善にアタックされてください。狙いは、フォームの仕掛けを不要にすること。当方、Accessから遠ざかること10数年。ここら辺りが限界です。

全文を見る
すると、全ての回答が全文表示されます。
回答No.5

一意の列はクエリにて容易に発生させることができますよ。 Option Compare Database Public intCount As Integer Function Numbers(strFieldName As String) As Integer   intCount = intCount + 1   Numbers = intCount End Function クエリ: Numbers([GoodsName]) AS ID フォーム: Option Compare Database Option Explicit Private Sub Form_Load()   intCount = 0 End Sub

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

On Error GoTo Err_DBCount Dim N Dim rst As ADODB.Recordset 関数の冒頭のDim文に不要な1行が残存していました。 このように修正して下さい。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

補足:ADO関数 Public Function DBCount(strQuerySQL AS String) As Variant On Error Goto Err_DBCount   Dim N   Dim strQuerySQL AS String   Dim rst        AS ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _     CurrentProject.Connection, _     adOpenStatic, _     adLockReadOnly     If Not .BOF Then        .MoveFirst        N = Nz(.Fields(0), 0)     End If   End With Exit_DBCount: On Error Resume Next   rst.Close   Set rst = Nothing   DBCount = N   Exit Function Err_DBCount:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBCount)" & Chr$(13) & Chr$(13) & _   "・Err.Description=" & Err.Description & Chr$(13) & _   "・SQL Text=" & strQuerySQL, _   vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBCount End Function DBSelect関数は少し大きい関数ですのでDBCount関数を紹介しておきます。DCount関数の3倍速で動作する筈です。なお、ADOの参照設定は必要です。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

Q、フォームの表示を工夫。 A、まず、フィールド[isFirst]を追加。 加えて、品名表示用のフィールド[Hinmei]も追加。 次に、それぞれのプロパティを設定。 フォームのレコードソース=クエリAとして話を進めます。 【isFirst】 =DBSELECT("Select Count(ID) FROM クエリA WHERE ID < " & [ID] & " AND GoodsName = '" & [GoodsName] & "'")=0 【iHinmei】 =IIf([isFirst],[GoodsName]," 〃") これで、クエリA自体に細工を施す必要を無くせます。やっぱり、クエリはシンプルが一番ですので・・・。 【クエリA】 SELECT ID, GoodsName FROM テーブル1 ORDER BY ID; [isFirst] の判定は、レコードソースを[ID]順に並べ、同じ品名の登場回数をカウントしています。過去に登場してなければ、その値は0。ですから、クエリをこのような判定が可能なように用意する必要があります。 Access の関数を利用しても構いませんが、処理速度に難点があります。それを解決するには、ADOを利用した関数の利用をお勧めします。その関数は、後ほどに補足します。 添付図は、フォームの表示例です。

19820202
質問者

補足

回答ありがとうございます。 この方式を実現するには、一意な値(キー)が必須になりますでしょうか?。私が抽出したいデータには一意になりうる項目がなく、この方法で実現が難しいようです。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

多分、添付図のような結果を欲したいのかと・・・。 でも、クエリでそれをやる必要性も意義もないと思いますよ。 どうしても、やりたければフォーム等の表示を工夫。

19820202
質問者

補足

回答いただいたような事が実現できればと考えております。フォームの表示を工夫すればよいとのことですが、どのような方法があるのでしょうか?。 現状は、クエリの結果を[詳細]へ表示しているだけのシンプルなフォームとしています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • AccessのSQLについて

    Access2000のSQLについての質問です。 コード 数量 ------------ A 3 A 2 A 1 B 2 B 3 の上記のテーブルからコードの部分を 単に重複なく抽出するにはどのようにdistinctを 使用すればいいのでしょうか? 希望結果(例) コード 数量 ------------ A (1-3のどれでもよい) B (2-3のどれでもよい) select distinct コード、数量 from Table にすると コード 数量 ------------ A 3 A 2 A 1 B 2 B 3 こうなってしまい、希望どおりにいきません。

  • 【再】2)-SQL文の書き方を教えてください。

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=694458 先日この問題で投稿しましたが、未完成のため、再度要望を整理し、ご指導をお願いいたします。 W←tabel名:名称、日付、数量 明細データ:     名称   日付    数量 A   2003/10/01   200 B   2003/10/03   500 C   2003/10/10   4000 A   2003/10/03   200 A   2003/10/03   100 C   2003/10/15   100 B   2003/10/15   300 C   2003/10/15   50 B   2003/10/15   60 求めているクエリーのイメージ:    2003/10/15 時点 ================================================ 名称     当日数量     当月数量     A          0       300     B         360       860     C         150       4150 ------------------------------------------------- 先日教えてもらったSQL文、希望のクエリーを作れないです。 -------------------------------------------------- select 名称, sum(AAA) as 当日数量, sum(BBB) as 当月数量 from ( select 名称, 0 as AAA, sum(数量) as BBB from W where 日付 >= #2003/10/01# and 日付 <= #2003/10/15# group by 名称 union select 名称, sum(数量) as AAA, 0 as BBB from W where 日付 = #2003/10/15# group by 名称 ) group by 名称; このSQL文は、2番目のSelectのところでエラーが出る (From句の構文エラーです) -------------------------------------------------- 後、Accessバージョンによって、SQL文が変わるでしょうか?当方は、Access97を使っている。 ご指導をお願いいたします。

  • シンプルなSQLの書き方がわかりません。

    以下のSQLをシンプルに一つにしたいのですが、どのように書いたらよろしいでしょうか? どうぞご返答頂けますようお願い申し上げます。 --test1_tblの抽出 select a1 as a1, b1 as b1 from a_tbl where c=1 --test2_tblの抽出 select a1 as a1, e1 as e1 from b_tbl where rowid in (select min(rowid) from ee group by a1) and a1 is not null and a1 !=' ' order by a1 --test1_tblとtest2tblの結合 select t0.a1 as a1, t0.b1 as b1, t1.e1 as e1 FROM test1_tbl t0, test2_tbl t1 WHERE (t0.a1 = t1.a1)

  • SQLでの集計について

    こんにちわ。以下のようなテーブルから条件に見合う合計を出したいと思いSQLを書いてみたのですが、 思った結果になりません。 テーブルA ID1 得意先Cd 営業所Cd 日付 1  001    001  2005/09/01 2  001    002  2005/09/01 3  001    001  2005/09/03 テーブルB ID2 ID1 部署 数量 金額 1  1  01  1  1000 2  1  01  1  1000 3  1  02  1  1000 4  2  01  1  1000 5  2  01  1  1000 6  3  01  1  1000 7  3  01  1  1000 8  3  02  1  1000 [抽出結果] 得意先Cd 営業所Cd 日付  部署 数量(Sum) 金額(Sum) 001    001  2005/09/01 01   2   2000 001    001  2005/09/01 02   1   1000 001    001  2005/09/03 01   2   2000 001    001  2005/09/03 02   1   1000 001    002  2005/09/01 01   2   2000 [SQL] select 得意先Cd,営業所Cd,日付,部署,SUM(数量) As '数量計',SUM(金額) As '金額計' from テーブルA AA Inner join テーブルB BB ON (AA.ID1 = BB.ID1) group by 得意先Cd,営業所Cd,日付,部署,数量,金額 order by 得意先Cd,営業所Cd,日付,部署 このSQLを実行すると、日付、部署共に同じ場合でも数量・金額が合計値となりません。 得意先Cd 営業所Cd 日付  部署 数量 金額 001    001  2005/09/01 01 1  1000 001    001  2005/09/01 01 1  1000 どのように変更を加えれば、上記の「抽出結果」にできるのでしょうか? よろしくお願いいたします。

  • SQL文で表すには

    以下の表を用いてSQL文を作成しようと思ってるんですが、途中までしか思いつかないので、どなたかご教授のほうよろしくお願いします。 shohin shiire 商品番号 商品名 単価   仕入番号 仕入先名  0001 みかん 100     001  A 0002 りんご 200     002 B 0003 ぶどう 300     003   C tran 購入番号 商品番号 仕入番号 数量 1 0001 001 1 2 0001 002 2 3 0001 003 3 4 0001 001 4 5 0001 002 5 6 0002 003 6 7 0002 001 7 8 0002 002 8 9 0003 003 9 10 0003 001 10 11 null 0004 20 これを以下のように出力するためにはどのようなSQL文を書けばよいですか? 商品番号 商品名 仕入番号 仕入先名 数量 単価 金額  0001 みかん 001    A   5 100 500  0001 みかん 002    B   7 100 700  0001 みかん 003    C   3 100 300  0002 りんご 001    A   7 200 1400  0002 りんご 002    B   8 200 1600  0002 りんご 003    C   6 200 1200  0003 ぶどう 001    A   10 300 3000  0003 ぶどう 003    B   9 300 2700  0004 null 004   null   20 null null ここまでは正しいと思うのですが・・・ select shohin.商品番号, shohin.商品名, shiire.仕入番号,     tran.数量, shohin.単価, tran.数量 * shohin.単価 as 金額 よろしくお願いします。

  • アクセスで重複データが消えてしまうのですが…

    アクセスで商品管理を行っています。 商品コードと数量を入力して各メーカーへの注文書を作成しますが、同じ日に同じ商品コードを選択すると2回目以降のデータが無視されてしまい困っています。 同じ商品であっても注文書に反映されるようにするにはどうしたらよいでしょうか?(複数行で表示されても、数量を合計して一行で表示されても構いません。)どなたか詳しい方助けてください。よろしくお願いします。

  • SQLを教えてください。

    以下に5つのテーブルがあるとします。 (1)全体テーブル  ・登録順番号(Key)  ・登録名 (2)商品テーブル  ・項目コード(Key)  ・品名コード(Key)  ・商品登録順番号(Key)  ・商品サイズ(Key)  ・品名 (3)商品単価テーブル  ・項目コード(Key)  ・品名コード(Key)  ・商品登録順番号(Key)  ・商品サイズ(Key)  ・登録順番号(Key)  ・商品単価 (4)新_商品単価テーブル  ・項目コード(Key)  ・品名コード(Key(Key))  ・商品登録順番号  ・商品サイズ(Key)  ・登録順番号(Key)  ・新_商品単価 (5)詳細テーブル  ・登録順番号(Key)  ・品名コード(Key)  ・原価項目コード(Key)  ・商品数量A  ・商品数量B 上記のテーブルから、以下の条件に合致する「(1)の登録名」「(2)の品名」「(4)の新_商品単価×(5)の商品数量※」を取得したい。 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 【条件1】全てAND条件 新_商品単価テーブルの項目コードが100  新_商品単価テーブルの品名コードが50 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※<0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 上記で抽出出来るレコードに加えて、以下 【条件2】全てAND条件 新_商品単価テーブルの項目コードが200~300あるいは400~500 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※=0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A どのようなSQLで抽出できますでしょうか?? DBはAccessです。

  • SQL Server複数テーブルの連結

    在庫管理を行う上で、3つのテーブルを結合したいと考えておりますが、うまく結合できません。 【テーブル抜粋】 ・販売  販売日  部門CD  店舗CD  商品CD  販売数 ・仕入  仕入日  部門CD  店舗CD  商品CD  仕入数 ・棚卸  棚卸日  部門CD  店舗CD  商品CD  実在庫 各テーブルから、日付で絞りこんで抽出は出来ていますが、上記を結合させる方法がわかりません。 ※各テーブルの商品数がバラバラです。 例えば、棚卸にはあるが、仕入も販売もない商品。 販売にはあるが、在庫も仕入もない商品N。 試した方法、在庫を基本に販売をLEFT OUTER JOINで結合し、仕入をLEFT OUTER JOINで結合しGROUP BYで集計 SELECT 部門CD,店舗CD,商品CD,ISNULL(実在庫,0) AS Z,ISNULL(販売数,0) AS B,ISNULL(仕入数,0) AS S FROM( SELECT 部門CD,店舗CD,商品CD,SUM(実在庫) FROM 棚卸 WHERE 棚卸日 BETWEEN (開始日) AND (終了日) ORDER BY 部門CD,店舗CD,商品CD )AS ZAI LEFT OUTER JOIN( SELECT 部門CD,店舗CD,商品CD,SUM(販売数) FROM 販売 WHERE 販売日 BETWEEN (開始日) AND (終了日) ORDER BY 部門CD,店舗CD,商品CD ) AS BAI ON ZAI.商品CD=BAI.商品CD LEFT OUTER JOIN( SELECT 部門CD,店舗CD,商品CD,SUM(仕入) FROM 仕入 WHERE 仕入日 BETWEEN (開始日) AND (終了日) ORDER BY 部門CD,店舗CD,商品CD ) AS SII ON ZAI.商品CD=SII.商品CD 上記の結果、結合はしたのですが、店舗間の商品数がバラバラとなりました。 例えば、aという店舗の販売数に、b販売数がはいっていたらり? ※結合する前の、クエリは正常に抽出しておりますので、結合方法が悪いと考えております。 もしかすると、テーブルの項目をそろえて、UNION ALLでつなげばと思ったのですが、コーディング方法がわからす・・・ 結合方法をアドバイス頂けたら幸いです。

  • アクセス2003 集計『最後』

    いつもお世話になっています。 <仕入記録テーブル>で商品Aを下記のように複数回入力してあります。(数字がズレてたらすいません。) | 仕入ID | 仕入年月日 | 商品名 | 数量 | 単価 |    76    2006/4/26       A      5     108    78    2006/4/28       A      5     108   253    2006/7/20       A     10     108   815    2006/11/10       A     10     120   843    2007/1/11       A      5     108   852    2007/1/12       A      2     120  1001    2007/2/19       A     10     120 クエリで<仕入記録テーブル>から各商品の最も最近の仕入単価を取り出したいと思い、デザインビューで<仕入記録テーブル>から<単価フィールド>を選択し集計方法を『最後』に設定しました。 すると表示された金額がなぜか108円になってしまいました。 やり方がおかしいのかと思いDLast関数というのも試してみたのですが、構文がイマイチ理解できずうまくいきませんでした。 仕入記録から仕入年月日の最も新しい仕入単価を出すにはどうしたらよいのでしょうか? よろしくお願いします。 

  • 集計表作成のマクロについて

    月末在庫の集計表を作成しています。 月末在庫を抽出すると、次のように表示されます。 ・B列 商品コード ・D列 商品名称 ・E列 デポコード ・F列 デポ名称 ・G列 数量 なお、3桁のデポコードのうち、右がBであれば「出荷止め品(B在庫)」そうであければ「通常品(A在庫)」です。 これらの情報を元に、商品ごと倉庫ごとの「通常品」「出荷止め品」の在庫数量を一覧にしたいと思っています。 ●一覧表作成の流れは次のように考えています。 1.抽出されたデータを「通常品」「出荷止め品」に分ける。(完了) 2.抽出されたデータの「(1)全てのリスト」(完了)「(2)通常品リスト」(×)「(3)出荷止め品リスト」(×)を作成する。 3.新しいシートを作成して、縦軸に(1)の商品コードと商品名称を抽出 4.横軸に(2)のデポコード・名称とその数量を抽出して小計を入れる。 5.「4」の小計欄の右から(3)のデポコード・名称とその数量を抽出して小計を入れる。 6.「4」と「5」の小計を足した「合計」を入れる。 7.倉庫ごとの合計数量を投入する。 8.罫線を設定する。   ⅰ 全体を実線で囲む。   ⅱ 縦線を実線にする。   ⅲ 小計欄の左右は二重線にする。   ⅳ 倉庫ごとの合計欄の上を二重線にする。 ここで問題が発生しています。「2」の(2)と(3)がうまく行きません。 「A在庫」も「B在庫」も抽出されたデータをもとに作成しています。 「デポコード」の右側1文字が「B」であれば「A在庫」の場合は「0」を表示「B在庫」の場合は「デポコード」「数量」など、必要な情報を抽出するようにしています。 「A在庫」「B在庫」のそれぞれの情報が抽出されても、「0」の欄が あると、エラーが出てしまいます。 分けた「A在庫」「B在庫」の「商品コード」「商品名称」「デポコード」「デポ名称」をリストとして表示するにはどうしたらよいのか、教えていただけませんか? また、他に在庫状況を把握するよい案があったら教えていただけると助かります。 ちなみに、現在のVBAは以下のように記入しています。 VBA初心者のため上の流れの「4」と「5」の辺りもよくわかっていません。何か参考になるサイトがあれば、教えていただけると助かります。 なお、現在のVBAも添付したいのですが、2000字を超えてしまうので ここでは載せていません。