ハガキ交換データのSQL文

このQ&Aのポイント
  • ハガキ交換データのSQL文についてお尋ねします。Parsonalsデータベースには、年賀状と暑中見舞いのデータテーブル(Cards)と個人データテーブル(Individuals)、家族データテーブル(Family)、住所データテーブル(Address)があります。
  • 個人データと個人ごとの家族データ・住所データ、さらに年賀状と暑中見舞いの最新の送信・受信年を取得するためのSQL文を教えてください。
  • ハガキ交換データのSQL文から、個人ごとの個人データ・家族データ・住所データ、最新の年賀状と暑中見舞いの送信・受信年を取得する方法について教えてください。
回答を見る
  • ベストアンサー

ハガキ交換データの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文かを教えてください。 ぜひ、よろしくお願いします。

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

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

DBエンジンは何ですか?

yasheeki
質問者

お礼

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

yasheeki
質問者

補足

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

その他の回答 (1)

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

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)を纏めることで対応できそうですね。

yasheeki
質問者

補足

大変申し訳ありません。 非常に分かりづらい質問文であり、質問自体もあやふやなものでした。お詫び申し上げます。また、 >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

  • SQLで。

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

    • 締切済み
    • PHP
  • SQL Server2000のテーブルのデータ型

    SQL Server2000のテーブルのデータ型には、自動でインクリメントされる整数型(Accessでいうところのオートナンバー型)が見当たらないのですが、無いのでしょうか? 何か別の操作で出来るのですか? よろしくお願いします。

  • SQL文で

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

  • 内部結合のSQL文

    次のような条件でのSQL文はどのように書けばよいのでしょうか? 売上テーブル(フィールドは「売上No.」)と売上明細テーブル(フィールドは「売上No.」「行番号」)を内部結合します。 結合の条件は売上明細テーブルの売上No.が売上テーブルの売上No.と等しいもの、かつ売上明細テーブルの行番号の一番小さいもの、です。 行番号はユニークですが、必ずしも1から順に振られているとは限りません。 どうぞよろしくお願いします。

  • 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)

  • SQL2005 クエリ文について

    どなたか教えて下さい。 SQL2005ですが、「商品マスタ」というテーブルに、「単価」という列があるのですが、この「単価」の数値を1.05倍したいです。 300⇒315のように。 どのようなクエリになるのでしょうか? 検索掛けたのですが、同様の質問が見付かりませんでした。よろしくお願いします。

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

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

  • SQLの条件文

    以下のデータで、dataで始まり、かつ数値部分を100~300の範囲で抽出したいと考えています。 テーブル名はtable1、フィールド名はretuです。 -retu- data023 unknowndata data105 data203 data827 SELECT retu FROM table1 WHERE retu LIKE 'data%' AND CAST(RIGHT(retu,3) AS Int) BETWEEN 100 AND 300 上記のSQLを作ってみたのですが、これだとunknowndataに対してCASTが行われてしまうらしく、CASTが失敗してデータを取り出すことができませんでした。 正しくデータを取り出すためには、どのように記述すれば良いでしょうか?

  • SQLのUPDATE文について

    SQL勉強中です。下記の様なデータを書き換えたいのですが、どの様なSQL文になるのでしょうか? ご教授下さいませ。 1つのテーブルに「会員NO」と「会員種別」という列がありまして、 会員氏名   会員No   会員種別 ・・・ --------------------------------- 田中一郎 1-0001 0001    ・・・ 鈴木二郎 2-0003 0001    ・・・ 会員Noの左端の数値が1なら会員種別を0001、2なら0002といった 形に振り分けたいのですが、どの様なSQL文になるのでしょうか? 自力ではなんとも上手くいきませんでした。 どうか、お助け下さいませ。

  • 等しくないデータの抽出

    テーブル1のフィールドa テーブル2のフィールドa を比較してテーブル1のフィールドaの中にテーブル2のフィールドaと中と重ならないものをだしたいのですが、SQLはどう書けばいいでしょうか。 (例題は数値ですが実際は文字列です) テーブル1 A 1 2 3 4 5 6 7 8 9 10 テーブル2 A 1 2 3 4 5 結果 6 7 8 9 10