• ベストアンサー
  • 困ってます

ハガキ交換データのSQL文

下記のような葉書のデータベースでのSQL分についてお尋ねします。 Parsonals データベースに、 年賀状と暑中見舞いとのデータテーブル(Cards)のほか、 個人データテーブル(Individuals)と 家族データテーブル(Family)と 住所データテーブル(Address)との4つのテーブルがあります。 4つのテーブルは、次のように構成されています。 Individuals, Family, Address, Cards です。 1.Individuals テーブルは、 ID (オートナンバー), Name (文字列), FamilyID (数値), AddID (数値) の4つのフィールド 2.Family テーブルは、 FamilyID (オートナンバー), FamilyName(文字列) の2つのフィールド 3.Address テーブルは、 AddID (オートナンバー), Address(文字列), Telephone(文字列) の3つのフィールド 4.Cards テーブルは、 CardID(オートナンバー), KindOfCard(YesNo), SendYear(数値 ヌル値許可), ReceiveYear(数値 ヌル値許可), IndividualID (数値) の5つのフィールド です。 個人データすべてのほか、個人ごとの家族データすべて、個人ごとの住所データすべて、 そして、個人ごとのKindOfCard(年賀状か暑中見舞いか)ごとにSendYearデータのうち最新のものと ReceiveYearデータのうちの最新のものを取得するSQL文を取得したいのです。 簡単にいえば、 個人個人に対して、その個々人の個人データ・家族データ・住所データのほか、 年賀状を送った最新の年と受けた最新の年、 暑中見舞いを送った最新の年と受けた最新の年を取得したいのです。 さらに、最新の送った年と最新の受けた年とが同一のときは、データが重複しますので一つに絞りたいです。 Cardsテーブルのフィールドには、SendYearもReceiveYearもありますので、単純にSendYearとReceiveYearを切り分けると当然データが重複するので、この重複は避けたいです。 このように毎年の葉書のやり取りを記録したデータから必要なデータを取り出したいというものです。私にとっては来年の年賀状を送るにあたって、どの人に出すべきかを判断する材料として、ぜひ取りだしたいビューなです。 かなり複雑なSQL文になるのかもしれませんが、どんなSQL文かを教えてください。 ぜひ、よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数44
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.1
  • bin-chan
  • ベストアンサー率33% (1403/4213)

DBエンジンは何ですか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

すみません、データベースそのものを伝えていませんでした。 Access または、SQL Server のどちらかで教えてください。 また、説明不足でしたが、Individualsテーブルの.ID = CardsテーブルのID です。 その他、Individuals.AddID = Address.AddID 、 Individuals.FamilyID = Family.FamilyID という 外部キー関係です。

質問者からの補足

申し訳ありません。 まず、 1)Where条件をKindOfCard=Yesにして、IndividualID別CardID別別にmax(SendYear)とmax(ReceiveYear)を取得するクエリ はどのようになるのでしょうか? よろしくお願います。

関連するQ&A

  • SQLで。

    webでphpを使ってpostgreSQLのデータを表示させています。 pgSQLのデータベース、「テーブルA」があります。 そこで「テーブルA」のデータを引っ張ってくるときに最後の50件だけを表示させたい場合は どういったSQL文だとそのデータを引っ張ってこれるのでしょうか? それともSQLでテーブルAのデータを全部引っ張ってきたあとphpで最後の50件だけ表示させないとだめなのでしょうか? ちなみに「テーブルA」にはフィールド名、「code」と言うフィールドにオートナンバー型のデータが 「1~n」あります。 初心者なのでうまく説明できなくて申し訳ありませんが 良いやり方がありましたら宜しくお願いしします。 PostgreSQL 7.0.2 PHP4

    • 締切済み
    • PHP
  • SQL文で

    すみません。質問させてください。 A,B,C,D,Eと5個のフィールドで構成されたテーブルtableがあるとします。 tableにはデータがすべて格納され(NULLなし)ています。 ですが、フィールドA,C,DについてA,C,Dとも同じデータが格納される ことがあります。 その重複したデータ以外を取得したいのですが (要するにフィールドA,C,Dでユニークのデータのみ取得) SQL文でどのように書けばいいかわかりません。 よろしくお願いいたします

  • 複数のテーブルへフォームから入力するには?

    ACCESSど初心者の者です。教えてください。 3つのテーブルがあります。 テーブル1 No.(オートナンバー),年(数値),月(数値),・・・多数の検針データ(数値型) テーブル2 No.(オートナンバー),年(数値),月(数値),・・・多数の検針データ(数値型・テーブル1とは項目違う) テーブル3 No.(オートナンバー),年(数値),月(数値),・・・多数の検針データ(数値型・テーブル1・2とは項目違う) 検針項目が多く1つのテーブルに収まらないため3つのテーブルに分けて作成しました。 検針データを毎月入力するのですが・・・ 1つのフォームで入力することは可能ですか? いろいろ調べてみたのですが・・・わからなかったので教えてください。

その他の回答 (1)

  • 回答No.2
  • bin-chan
  • ベストアンサー率33% (1403/4213)

Access(MDB)でもSQL Serverでも、フロントエンドはACCESSですね? 基本的にはデザインビューでクエリを作成して、SQLビューでSQL文表示するのが簡単でしょう。 テーブル4.Cards テーブルの構造からするとKindOfCardで暑中見舞い/年賀状を識別するんですかね? 1)Where条件をKindOfCard=Yesにして、IndividualID別CardID別別にmax(SendYear)とmax(ReceiveYear)を取得するクエリを作成。 2)Where条件をKindOfCard=Noにして、IndividualID別CardID別別にmax(SendYear)とmax(ReceiveYear)を取得するクエリを作成。 3)テーブル1~3を結合して送付先を取得するクエリを作成。 4)1)と2)と3)を結合(3のすべて、1・2はあるもの)年は4列アリ 5)1)2)のSendYearとReceiveYearを判断して、不要なものを表示しない。 の5段階で作成していくことになると思います。 「一文で表記したい」なら、1)~5)を纏めることで対応できそうですね。

共感・感謝の気持ちを伝えよう!

質問者からの補足

大変申し訳ありません。 非常に分かりづらい質問文であり、質問自体もあやふやなものでした。お詫び申し上げます。また、 >ACCESS でも今回のような複雑なものをSQLビューを使って扱う方法が分かりません。 >KindOfCardで暑中見舞い/年賀状を識別 しています。 テーブルの構成をもう一度代えての質問となってしまい、恐縮です。 どれが外部キーなのかも分かりづらかったと思われ、申し訳ありません。 質問方法を変え、若干フィールドを変更します。 もう一度、4つのテーブルのフィールドを若干代えての質問になります。 1.Indvidualsテーブルは、ID, Name, FamilyID, AddID 2.Familyテーブルは、FamilyID, FamilyName 3.Addressテーブルは、AddID, Address, Tel 4.Cardsテーブルは、KindOfCard, CardYear, SendDate, ReceiveDate, ID というフィールドを持っています。(SendYear, ReceiveYearを変えました、 (当初質問のフィールドと違って申し訳ありません) これらの情報をもとに、 どこの誰に何年に年賀状を送ったのが最後だったか、どこの誰から暑中見舞いをもらったのが最後だったか、どこの誰からもらった年賀状は何年だったろうか?などを得て、来年に向けて年賀状を出したいと思っています。暑中見舞いもしかりです。(そのとき喪中だったかなどは今回除外しています) 単純に下記のようなクエリでは、もらったハガキが羅列されるだけなので、何年もたったデータがあると行が多くなりすぎて見づらくなります。 下記のようなSQL文では、数年越しのデータが表示されて、結局だれに送るべきかの判断をするには、行が多すぎてしまいます。 SELECT I.ID, I.FamilyID, I.AddID, I.Name, F.FamilyName, A.Address, A.Tel, C.CardYear, C.KindOfCard, C.SendDate, C.ReceiveDate FROM Family AS F INNER JOIN (Cards AS C INNER JOIN (Address AS A INNER JOIN Individuals AS I ON A.AddID=I.AddID) ON C.ID=I.ID) ON F.FamilyID=I.FamilyID; で、ここで最近のハガキ以外を除きたいのです。(除外するという観点ではなくて、最近のデータを抽出するという観点です) 例) Aさんは一昨年年賀状をくれた。けれど、Aさんには昨年年賀状を出したけれど返ってこなかった。 Bさんは昨年年賀状もくれたし、暑中見舞いもくれた。けれど、こちらからは昨年年賀状は送ったけれど、暑中見舞いは送らなかった。 など、最近のデータに限ったデータとして、Aさんとのハガキのやり取りの他にAさんの住所データや家族データなども含めたデータを得たいのです。 bin-chanさんのご回答は非常にありがたいのですが、なにしろ、初級者未満の身なので、Whereと結合とがゴッチャになって結局どんなクエリになるか分からないのです。(不勉強でごめんなさい) 大変申し訳ないのですが、SQLサンプルをいただきたいところです。(是非心からお願いします) 自分勝手でゴメンナサイ。能力不足のため答えから学びとらせてください。

関連するQ&A

  • オートナンバー型を抽出条件にするとき

    いつもお世話になります。 VB.NET2003+Access2000環境です。 あるテーブルにはオートナンバー型を使って新規発生データの管理番号を振っていますが、別のテーブルでその番号を見て手入力しているフィールドがあります。 SQLの抽出条件でこのオートナンバーと手入力したデータと一致したデータを抽出しようとやっているのですがうまくいきません。 オートナンバーのデータを参照して入力するほうのフィールドを数値型にしてもテキストにしてもいずれも「型が一致しない」というエラーが起こります。 こういう場合はどういう風な処理をするのが一般的なのでしょうか? よろしくお願いいたします。

  • SQL文でのデータの取得が上手くいきません

    初めて質問させていただきます。 こちらのカテゴリで良いのか分からなかったのですが、よろしくお願いいたします。 SQL文を作成しているのですが、上手くいかず困っている状況です。 要件としてはテーブルAにユーザーの情報が格納されているのですが、 キーの一つとして世代(SEDAI_NO)(日付)を持っております。 今回取り出したいデータは該当ユーザーの処理日以前の最新のデータを 取得したいと思い以下のSQL文を作成しましたが、上手く行かず、最新世代を含むそれ以前の世代のデータを取得してきています。 どこがおかしいのでしょうか? よろしくお願いいたします。 【作成したSQL】 select * from テーブルA テーブルA’ where (USER_ID=該当のユーザーID) and (SEDAI_NO = (select max(SEDAI_NO) from テーブルA where SEDAI_NO = テーブルA’.SEDAI_NO AND 処理日 >= テーブルA'.SEDAI_NO)

  • [MS Access]クエリで変換 hhmm(数値型)⇒hh:mm(日付/時刻型)

    テーブル上で”930”や”1030”というように数値型になっているデータを、 クエリ上では”9:30”や”10:30”の日付/時刻型へ変換したいと考えております。 この場合、どのようなSQL文で記述をすればよろしいでしょうか? テーブルやフィールは下記のようになっております。 ■テーブル名 tbl_サンプルテーブル ■フィールド名 ID(オートナンバー型) 時刻(日付/時刻型)

  • フォームから2つのテーブルにデータを書き込みたい

    Accessで T_aテーブルとT_bテーブルがありそれぞれのフィールドが以下のようになっているとします。 T_a:フィールド名 データ型    ID  オートナンバー型    商品番号 テキスト型 主キー T_b:フィールド名 データ型    ID  オートナンバー型 主キー    商品番号 テキスト型 このときフォームから入力したデータをそれぞれのテーブルの商品番号に追加したいのですがどのようにすればよいのでしょうか。  よろしくお願いいたします。

  • SQLでの日付比較

    いつもお世話になっております。 SQL文に関して質問ですが、テーブルに年と月が別に入っているフィールド(4桁、2桁の数値型)があり本日から3年以内のものを抽出するにはどうやって書くのがいいのでしょうか? 日付のフィールドは無いので計算するのは月だけでいいのですが・・・。 よろしくお願いいたします。

  • Accessでのテーブル作成や追加クエリなどについての質問です。

    ◆テーブル作成クエリで作成するテーブルにオートナンバー型のフィールドを設けたい。◆ (ナンバーが必ず1から振られることが条件) ※補足※ あらかじめオートナンバー型を含むテーブルを用意し、追加クエリ&削除クエリを使用すればよいという意見もありますが、この場合オートナンバー型のフィールドはカウントをアップし続けてしまう為断念。 ★教えてほしい事★ テーブル作成クエリからオートナンバー型のフィールドを作成できるのか? もしくは あらかじめオートナンバー型を含むテーブルを用意し削除クエリでテーブルのデータを空にしてから追加クエリでデータを入力しても必ずオートナンバー型のフィールドの先頭値は"1"から始まるようにできるか? 宜しくお願い致します。

  • SQL文

    こんにちは。 ACCESS2000を使用しています。 テーブルに受付番号と性別(男性=1・女性=2)のフィールドがあります。 性別のフィールドだけを使用して、男性人数・女性人数・男女の合計人数・男性比率・女性比率を求めるSQL文の書き方がわかりません。 アドバイスよろしくお願いいたします。 ※下記SQLで性別毎の人数までは出せるのですが。。。 SELECT 性別, Count(性別) AS 人数 FROM データテーブル GROUP BY 性別;

  • SQL文で、1,2,3、以外(0とかブランク)を1と見立てて集計したい

    データを取り出す時次のように書きます SELECT テーブル1.id, テーブル1.kubun FROM テーブル1; このフィールドkubun、は本来、1、か、2、ですが 例外的にブランクや0(ゼロ)が入っています。 フィールドkubun、がブランクやゼロだったら、1に変換 しながら、テーブル1から集計するSQL文はないでしょうか? テーブル1を前もって変換しておけが、いいのですが そうした方法を使わず、集計の時に行いたいのですが

  • ACCESSクエリでの結合の仕方・・・SQL文かも

    ACCESS 2003を使用しています。 テーブルA テーブルB の2テーブルでクエリを作っています。 結合的には・・・ テーブルAのフィールドX ⇔ テーブルBのフィールドY です。 これで2テーブルに共通する一致データのみ抽出はできるのですが、 2テーブルに共通する一致データに加えて、 2テーブルの不一致データも一緒にクエリ表示されるようにしたいのです。 欲しいのは抽出イメージは、以下のような感じのクエリ結果です。 テーブルA:フィールドX|テーブルBのフィールドY a             |(空) (空)           |b c             |c d             |(空) (空)           |e f              |f  g             |(空) h             |h おそらく、SQL文を書く必要があるとは、想像できるのですが・・・ どなたか、ご教授いただけると助かります。 よろしくお願いします。

  • INSERT文で発行したオートナンバーを取得したい

    いつも勉強させて頂いています。SQL文について困っています。 -環境- .NET FreamWork2.0 VB SQLSERVEREXPRESS -SQL- インサート時にオートナンバーを取得してデータを追加しているのですが、追加後にオートナンバーの値を戻す(取得する)ことは可能でしょうか?SQL文は下記です。 INSERT INTO マスタテーブル VALUES((SELECT MAX(オートナンバー) + 1 FROM マスタテーブル), 商品名・・・・ 上記で登録されたオートナンバーを別テーブルに格納したい為です、リアルタイムで処理しますので、発行したオートナンバーが即時に必要です。 テーブル更新時に  Dim Ret_Table As DataTable = AS_Cmd.ExecuteScalar() とするとテーブル内容がNothingになります。 他の方法も御座いましたら教えて頂けると幸いです。宜しくお願い致します。