• ベストアンサー

Accessで縦に情報が展開されてるテーブルの処理

作業環境は以下の通りで、Accessの知識は初心者です。 OS:Windws7/使用ソフト:Access2003 やりたい事はこれに近いのですが、もう一ひねりある為困っています。 http://okwave.jp/qa/q2452277.html?from=recommend テーブルに以下のようなデータがあります。 薬剤/配番/効果/使用方法 A剤/00001/頭痛/1回1錠 A剤/00002/発熱/食後…(長文) B剤/00001/頭痛/1回2錠 B剤/00003/裂傷/清潔な手で…(長文) これを薬剤名ごとに、効果(数は120を超えます)と使用方法を横へ並べる事はできますか?

この投稿のマルチメディアは削除されているためご覧いただけません。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.12

#9です > 実行時エラー'94': > Nullの使い方が不正です > > デバックボタンを押してみると55行目の↓この部分が黄色く反転されました。 > sA(i * 2 - 1) = rs("効果") おそらく、「効果」にデータが無くて Null になっていると思われます。 ※ データ/テーブル内容からすると、何かしら設定されているものと思っていたんですが・・・ 対処方法は2つあって、 1)代入する時に Nz 関数を使って Null を ""(空文字)に置換える >    sA(i * 2 - 1) = rs("効果") >    sA(i * 2) = rs("使用方法") ↓     sA(i * 2 - 1) = Nz(rs("効果"))     sA(i * 2) = Nz(rs("使用方法")) ただ、これには問題がありそう というのは、両方値が入っていなければ良いと思いますが、 どちらか一方だけに値が設定されていたら・・・ 変な内容に? 2)必ず「効果」「使用方法」両方に値が設定されているものを対象にする >  Const CSQL1 As String = "SELECT DISTINCT 配番 FROM {%1};" >  Const CSQL2 As String = "SELECT * FROM {%1} ORDER BY 薬剤;" これで抽出しているわけですが、 条件として「効果」「使用方法」とも設定されているもの・・・ を、追加します。  Const CSQL1 As String = "SELECT DISTINCT 配番 FROM {%1} " _    & "WHERE 効果 Is Not Null AND 使用方法 Is Not Null;"  Const CSQL2 As String = "SELECT * FROM {%1} " _    & "WHERE 効果 Is Not Null AND 使用方法 Is Not Null ORDER BY 薬剤;" これに変更すると、1)での変更は不要です。 けど、念のために1)も適用しておいた方が良いかも この修正でどうなりますでしょうか

lotus2014
質問者

お礼

回答ありがとうございます。 > おそらく、「効果」にデータが無くて Null になっていると思われます。 確認してみたところ確かにNull値がありました。 選択クエリで効果と使用方法と両方の3タイプにIs Nullで抽出をかけたところ、効果のみNull値が存在するようです。 その為、2)に変更してみたところ、希望通り横に展開されました!! ありがとうございます。 処理の解説も頂いていましたので、落ち着いたら本格的にAccessの勉強を始めたいと思います。 (排出されたCSVをもう一加工する為に他のソフトとの連携設定を考えなくてはならないのです…)

その他の回答 (14)

回答No.4

追伸、CSV出力を考えるとクエリ二個は以下に差し替えた方が良さそうです。 Q効果は TRANSFORM Iif(Isnull(First(Tbl.[効果])),'',First(Tbl.[効果])) AS 効果の先頭 SELECT Tbl.[薬剤] FROM Tbl GROUP BY Tbl.[薬剤] PIVOT '効果' & Tbl.[配番]; Q使用方法は TRANSFORM Iif(Isnull(First(Tbl.[使用方法])),'',First(Tbl.[使用方法])) AS 使用方法の先頭 SELECT Tbl.[薬剤] FROM Tbl GROUP BY Tbl.[薬剤] PIVOT '使用方法' & Tbl.[配番];

lotus2014
質問者

お礼

回答ありがとうございます。 テスト環境で試したところ、うまくいきました! ただ、本番環境で試したところ、やはりフィールド数の多さからか(247ありました) 「このフォームまたはレポートは、1つのレコードのデータの制限を超えるクエリを基にしています」 と小窓が開き、表示されませんでした。 Q効果、Q使用方法、Q薬剤については問題なく表示されます。 今はまだ、このSQL文がどんな命令をしてるか分からないまま入力したのですが、時間を作って理解を深めようと思います。 わざわざ考えて頂いてありがとうございました。

回答No.3

>とりあえずチャレンジしてみたいので、このように両方保存いたしました。 両クエリは問題なかったのでしょうか検証済み? >正確な数は122×2の為、255は超えないようです。 では余計な心配はしないことにします。 クエリをさらにもう一個、SQL文は SELECT DISTINCT 薬剤 FROM Tbl; これは、名前を Q薬剤 にして保存。 これが最後のクエリ Q薬剤、Q効果、Q使用方法を新規クエリのデザインウィンドウにドラッグ、 Q薬剤とQ効果の薬剤同士を結合、 Q薬剤とQ使用方法の薬剤同士を結合、 Q薬剤の薬剤をデザイングリッドにドラッグ、 Q効果の効果1、使用方法1、効果2、使用方法2、効果3、使用方法3、・・・・、使用方法122 と交互にドラッグします。 データシートビューに切り替えて確認してみてください。 OKだったら、名前は適当に保存。 あとはリボンのエクスポートからテキストファイルを選択し ウィザードに従ってこのクエリをエクスポートしてみてください。

回答No.2

薬剤/配番/効果/使用方法 A剤/00001/頭痛/1回1錠 A剤/00002/発熱/食後…(長文) B剤/00001/頭痛/1回2錠 B剤/00003/裂傷/清潔な手で…(長文) を 薬剤/効果1/使用方法1/効果2/使用方法2 /効果3/使用方法3    /・・・ A剤/ 頭痛/  1回1錠/ 発熱 /食後…(長文)/ B剤/ 頭痛/  1回2錠/    /      /裂傷 /清潔な手で…(長文)/・・・ のようなイメージ?にしたいということでしょうか? 現時点で >数は120を超えます(120×2) なのでAccessの扱えるフィールド数は最大でも255以下の制限に間もなく引っかかりそうです。 【崖っぷち状態です】 制限を超える可能性があるのでは? とりあえず、クロス集計までは、 テーブル名を、Tbl とします。 新規クエリをデザインビューで開いて、 『テーブルの表示』の小窓は閉じます。 右クリックすると「SQLビュー」がリストにありますので選択、 SELECT: って書いてあるので消去し そこへ下記をコピペ TRANSFORM First(Tbl.[効果]) AS 使用方法の先頭 SELECT Tbl.[薬剤] FROM Tbl GROUP BY Tbl.[薬剤] PIVOT '効果' & Tbl.[配番]; データシートビューに切り替えると 薬剤 効果1   効果2   効果3 A剤  頭痛    発熱 B剤  頭痛         裂傷 となります。このクエリを、Q効果 とでも命名して保存。 もう一個同様に、 TRANSFORM First(Tbl.[使用方法]) AS 使用方法の先頭 SELECT Tbl.[薬剤] FROM Tbl GROUP BY Tbl.[薬剤] PIVOT '使用方法' & Tbl.[配番]; で 薬剤 使用方法1 使用方法2 使用方法3 A剤   1回1錠   食後 B剤   1回2錠        清潔な手 になります。これは、Q使用方法 とでも保存。 (使用方法フィールドがメモ型だと厄介かも) さて、ここからが前述の255の制限を超える可能性の有無で分かれます。 CSVのフォーマットの具体例もないので とりあえず、ここまで。 余談ですが また、めでたくCSVが完成したとしてアップロードして 使ってみたら「使いにくいので再考」になったら・・と考えてしまいます。。。

lotus2014
質問者

お礼

回答ありがとうございます。 薬剤/効果1/使用方法1/効果2/使用方法2 /効果3/使用方法3    /・・・ A剤/ 頭痛/  1回1錠/ 発熱 /食後…(長文)/ B剤/ 頭痛/  1回2錠/    /      /裂傷 /清潔な手で…(長文)/・・・ のようなイメージ?にしたいということでしょうか? その通りです。 使用方法フィールドはメモ型です。 120×2…単純に×2になる事を理解していませんでした > Q効果 とでも命名して保存。 > Q使用方法 とでも保存。 とりあえずチャレンジしてみたいので、このように両方保存いたしました。 正確な数は122×2の為、255は超えないようです。 > 使ってみたら「使いにくいので再考」になったら・・と考えてしまいます。。。 データを抜き出したいだけなので問題ないハズ…です。

  • panacon
  • ベストアンサー率31% (214/679)
回答No.1

lotus2014さんへ  見せるだけで良いのなら、薬剤と配番と効果でクロス集計を作って、そのクエリに使用方法を連結するクエリを作ったものをソースにしたフォームで良いと思います。  クロス集計は、効果を横に配置する形で、データ領域に配番を選択して、配番の集計方法を先頭としておけばOKです。  他のクエリで、薬剤と使用方法のみをグループ化したものと、配番と効果のみをグループ化したものを作っておいて、先のクエリと薬剤、配番で連結すれば、薬剤+配番n個+効果n個+使用方法のクエリを作れます。  入力を考えているとしたら、薬剤と使用方法をメインフォームにして、配番と効果をサブフォームにするようにテーブルに変更すれば良く、そこからの横並びは、前述の真似をしながら、それなりに作れば良いと思います。

lotus2014
質問者

補足

回答ありがとうございます。 入力することはなく、最終的にはアップロード用に「.csv」として出力させたい為、リレーションされた内容が横1行に吐き出されるようにしたいのです。 > 先のクエリと薬剤、配番で連結すれば、… がうまくいかない(配番が表示されない)のですが、クロス集計の設定が間違っているのでしょうか? 薬剤/効果1/効果2/効果3 A剤/00001/空 欄/00002 B剤/00001/空 欄/空 欄 C剤/00001/000003/空 欄

関連するQ&A

  • ACCESSで縦に並んだテーブルデータを横に並べることは出来ますか?

    お世話になります。現在大量にデータを前に悩んでいます。 テーブルに以下のようなデータがあります。 | 薬剤名 | 効果 | ----------------------- | A剤  | 頭痛 | | A剤  |生理痛 | | A剤  | 発熱 | | B剤  | 歯痛 | | B剤  |生理痛 | | C剤  | 頭痛 | これを、薬剤名ごとにまとめ効果を横へ並べる。 | 薬剤名 |効果1|効果2|効果3|効果4| ------------------------------------------- | A剤  | 頭痛 |生理痛| 発熱 | | | B剤  | 歯痛 |生理痛|   | | | C剤  | 頭痛 |   |   | | ことって出来るのでしょうか? 効果の数はいくつになるか分かりません。現在は最大7つですが、今後それ以上の物が出る可能性もあります。 ACCESSでは無理なことでしょうか? また、ACCESSのバージョンは2002です。なお、ACCESSについては、使用法を含め初心者に毛が生えたくらいの知識しかありません。申し訳ありませんが「サル」にもわかるくらいの優しさでご指導願えれば幸いです。 よろしくお願いします。

  • Access2つのテーブルの差額を出すピボット

    Access2007を使用しています。 以下のような2つのテーブルがあります。 <テーブルA> 区分 品番 金額  数量 A  001 10000  10 A  S12 5000   5 A  002 8000   8 A  001 6000   6 <テーブルB> 区分 品番 金額  数量 B  001 2000  2  B  S12 3000  3 このデータを元に、以下のような結果をピボットで表示したいと思っています。       区分       A  |  B   |合計 品番  数量 金額|数量 金額 |数量 金額 差額(A-B) 001 16 16000| 2 2000 | 18 18000 14000 002 8 8000 |      | 8  8000  8000 S12 5 5000 | 3 3000 | 8  8000  2000 テーブルAとBをユニオンクエリでまとめ、ピボットを作って みたのですが、差額の部分が出せず・・・ どうぞよろしくお願いします。

  • 統計のお話

    Aという薬剤と、Bという薬剤を使用した場合の、それぞれの効果は出せているのですが、これらを併用した場合の効果を統計上で出すことは可能でしょうか? 効果は、血液のデータにより比較しています。 どなたか教えて下さい。 宜しくお願いします。

  • ポンタールが効かない

    最近、耳鼻科でアレルギーとふくびく炎の薬をもらって、もともとの頭痛もちでたまに頭痛がするのでイヴを飲んでることも伝えると、薬の飲み合わせでだめなものもあるからとポンタールを処方されました。 (ふくびく炎の症状で頭痛があることも聞きました。それより元々の頭痛もちであるとは思うのですが) もらってから一度、頭痛のときポンタール1錠飲んでもきかなかったので30分後ぐらいにもう1錠飲みました。 規定で1日2回までとあったので、既定の範囲ないで、そのうち痛みはなくなったので効いてよかったと思ったんですが。 現在、頭痛で先日と同じように1錠飲んでから効かなかったのでもう1錠追加で飲みました。 ですが、全然頭痛の傷み具合がおさまりません。 おでこらへんが痛いんです。 イヴを飲もうかとも考えたんですが、アレルギーの薬との飲み合わせ・・・と言われたので、だめなんだろうけどもう1錠ポンタールを飲みました。 2・3時間で時間差ではありますが3錠飲んでいることになります。 飲んで10分ぐらいはたったでしょうか、まだ痛みは変わらない程度です。 これは私にはポンタールが合わないということでしょうか? それと、3錠短時間に飲んでしまって大丈夫だったでしょうか? こんな時間で、医者にも薬剤師にも問い合わせられず、痛みで顔をゆがめながら書いています。

  • Access処理を自動化するには?

    以下の状況で困っています。お知恵を拝借できれば幸いです。 宜しくお願いいたします。 <状況の作業> 1)システム甲より、特定のフォルダにCSVデータA,Bがエクスポートされる。 2)データAをテーブルAにインポートする。 3)データBをテーブルBにインポートする。 4)テーブルAにある重複をクエリでなくす。(クエリA) 5)クエリAとテーブルBからクエリを使用して最終データを作る。(クエリ最終版) 6)クエリ最終版をエクスポートして、CSVで保存する。(最終版.csv) 7)システム乙に「最終版.csv」をインポートする。 ※メモ   元のCSVがエクスポートされる場所はサーバ上です。   元のCSV名は、「YYYYMMDD_固定部分.csv」で名称が変動します。 <やりたい事> 上記の作業のうち、2)~6)を自動化したい。

  • 【SQL2000】アクセスログからレコメンド機能(ビュー)を作りたい

    SQL文の組み立て方がさっぱりわからないので質問です。 ある商品テーブルの閲覧履歴テーブルから、レコメンドエンジンを 作りたいと思っています。 (amazonなどである「この商品を見た人はこんな商品も見ています」ってヤツです) 以下AテーブルからBのビューを導きたいのですが どのようなSQL文を書けばいいのでしょうか? ■Aテーブル ┌────┬────────┐ │商品番号│見た人     │ ├────┼────────┤ │1    │A        │ ├────┼────────┤ │1    │B        │ ├────┼────────┤ │2    │A        │ ├────┼────────┤ │2    │B        │ ├────┼────────┤ │4    │C        │ ├────┼────────┤ │5    │D        │ ├────┼────────┤ │9    │B        │ ├────┼────────┤ │10   │B        │ ├────┼────────┤ │11   │D        │ ├────┼────────┤ │11   │B        │ ├────┼────────┤ │12   │A        │ ├────┼────────┤ │12   │B        │ ├────┼────────┤ │12   │C        │ └────┴────────┘ ■Bビュー ┌────┬────────┐ │商品番号│他に見た商品番号│ ├────┼────────┤ │1    │2        │ ├────┼────────┤ │1    │12       │ ├────┼────────┤ │2    │1        │ ├────┼────────┤ │2    │12       │ ├────┼────────┤ │11   │5        │ ├────┼────────┤ │11   │1        │ ├────┼────────┤ │11   │2        │ ├────┼────────┤ │11   │10       │ ├────┼────────┤ │11   │12       │ ├────┼────────┤ │12   │1        │ ├────┼────────┤ │12   │2        │ ├────┼────────┤ │12   │4        │ ├────┼────────┤ │12   │9        │ ├────┼────────┤ │12   │10       │ ├────┼────────┤ │12   │11       │ └────┴────────┘ 考え方だけでも構いませんのでご教示いただければ幸いです。

  • Access 長文の文字列結合

    選択クエリAには空のフィールド1があります。 選択クエリCには説明文1というフィールドがあります。 空のフィールド1に説明文1と、ある長文の文字列を収めたい為、以下のようにしました。 選択クエリC.説明文1 & "長文文字列1" AS 空のフィールド1 として、SQLビューへ直接、長文文字列を入力しています。 ※デザインビューにすると「指定した式はクエリのデザイングリッドの1024文字の制限を超えています」と出て開けません。 こういった書き方は力技なのでしょうか? また、この長文の文字列ですが、種類が複数あります。 クエリAのフィールド1には、説明文1と文字列1、フィールド2には、説明文2と文字列2、 クエリBのフィールド1には、説明文1と文字列3、フィールド2には、説明文2と文字列4 など、クエリAやBのような他のクエリを複数作成したい為、 別のスマートな書き方があればご教示いただきたく思っております。 クエリCはデータベースからダウンロードしたものをAccessにインポートして成型した情報で、 クエリA、B等はシリーズ別の説明文の雛形として使用しています。 長文文字列は注意文のようなもので、その中の一文だけが違う文章です。 作業環境は、OS:Windws7、使用ソフト:Access2003となっております。 どうぞ宜しくお願い致します。

  • 1テーブルに対して別々の条件で集計する方法

    以下のような集計を、VIEWを使わずに1回のSQLでできますでしょうか。 【対象TBL】 CD FLG KINGAKU A, 0, 100 A, 0, 200 A, 1, 1000 B, 0, 50 B, 1, 60 【出したい結果】 CD KINGAKU_0 KINGAKU_1 A, 300, 1000 B, 50, 60 普通のSUMで出る以下の結果を、サブクエリなどで横展開しようと試みてるのですが、 うまく出来ません。。 CD FLG KINGAKU A, 0, 300 A, 1, 1000 B, 0, 50 B, 1, 60

  • accessで2フィールドの置換

    以下の方法ではSQLが2回実行されています。1回でできるSQLを教えてください。 a b 1 1 2 1 1 2 2 2 update t set a=3 where a=1; update t set b=3 where b=1; a b 3 3 2 3 3 2 2 2

  • エクセルの表をさらにマトリクス表に展開したい。

    初めて質問させて頂きます。 仕事上でエクセル2003を使用しています。 以下の作業を簡単にできるように、数式またはマクロを組むことを考えています。 表1を表2のように展開する。(例) 表1    A  B  C 1  A1 B1 あいうえお 2  A2 B2 かきくけこ 3  A3 B1 さしすせそ 4  A4 B2 たちつてと 5  A1 B1 なにぬねの 表2    A    B       C   1       B1      B2 2  A1 あいうえお      なにぬねの 3  A2         かきくけこ  4  A3 さしすせそ  5  A4         たちつてと ※行の数は実際はもっと多いです。  また表2のB2に記入してある内容は  複数行になっても構いません。 まずはマクロ(VBA)を使わずにできるかやってみましたが、 VLOOKUPなどでは、なかなかうまくいきません。 よい方法はないでしょうか? VBA使用でもかまいません。 ヒントだけでもぜひよろしくお願いします。

専門家に質問してみよう