• ベストアンサー

グループ化したいのですが

テーブルAに以下のような項目があります。 [MAIL_ID][SEND_DATE][USER_ID] テーブルBに以下のような項目があります。 [USER_ID][SEI][MEI] やりたい事は、 ・テーブルAとBを[USER_ID]をキーにして結合させたい。 ・テーブルAの[MAIL_ID]ごとにグループ化して1行にまとめたい。 ・テーブルBの[SEI]と[MEI]をつなげて1つの項目として表示させたい。 これを実現させるには、どういうSQLを書けば良いでしょうか? 私が試したのは、以下のSQL文です。 SELECT A.MAIL_ID, MIN(A.SEND_DATE) AS SEND_DATE,MIN( A.USER_ID) AS USER_ID,MIN(B.SEI) + MIN(B.MEI) AS ATESAKI FROM TABLEA A INNER JOIN TABLEB B ON A.USER_ID = B.USER_ID WHERE A.SEND_ID = '900001' GROUP BY A.MAIL_ID でも、これだと同じMAIL_IDが複数存在すると[SEI][MEI]が別人のものがくっついてしまいます。当然ですが。 グループ化する前に[SEI][MEI]を連結させる処理が必要なのだろうと思うのですが、それをどうすれば良いのかが分かりません...。 どうかよろしくお願いします。m(_ _)m

  • ha3y
  • お礼率80% (12/15)

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

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

[SEI]と[MEI]がそれぞれ単独でMIN関数を使用されていますが、 これは連結後でも良いのでは? MIN( B.SEI + B.MEI ) みたいな感じで。 どうでしょうか?

ha3y
質問者

お礼

できました~!! 何か特別な関数とかを使わないといけないのかもという先入観から1週間くらい分からなかったんですが。 ありがとうございました。

その他の回答 (1)

回答No.2

同じ[MAIL_ID]で違う[USER_ID]のレコードが存在するということでしょうか? その場合[MAIL_ID]でグループ化した、どの[USER_ID]の[SEI][MEI]を出力したいのですか? (現在はそれぞれ別個に最小値を出力しているようですが) 最小値を出力するのでしたら[MIN(USER_ID)]の[SEI][MEI]を出力したほうが良いのでは?

ha3y
質問者

お礼

複数の人に同じメールを出す場合、[MAIL_ID]には同じ番号が入るようになっているのです。 >MIN(USER_ID)]の[SEI][MEI]を出力したほうが良いのでは? その通りです。そのやり方が分からなかったものでで...。

関連するQ&A

  • グループ化したいのですが

    テーブルAに以下のような項目があります。 [ID][SEI][MEI] やりたい事は、 ・[ID]ごとにグループ化して1行にまとめたい。 ・[SEI]と[MEI]をつなげて1つの項目として表示させたい。 これを実現させるには、どういうSQLを書けば良いでしょうか? 私が試したのは、以下のSQL文です。 SELECT ID,MIN(SEI) + MIN(MEI) AS NAME FROM TABLEA GROUP BY ID でも、これだと同じIDが複数存在すると[SEI][MEI]が別人のものがくっついてしまいます。当然ですが。 グループ化する前に[SEI][MEI]を連結させる処理が必要なのだろうと思うのですが、それをどうすれば良いのかが分かりません...。 どうかよろしくお願いします。m(_ _)m

  • SQL GROUPで件数の一番多いレコードのみ取る

    SQL GROUPで件数の一番多いレコードのみ取る ORACLE10です。 次のようなテーブルがあります。 USER -----------テーブル名 ID,NAME,DATA----列名 1,A,any 1,A,any 1,B,any 2,C,any 3,D,any このテーブルから、IDをGROUPにして、さらに、一番使用頻度の多いNAMEを取得したいのです。 表示したいのは、IDとNAMEです。 つまり、取得結果例は次のようになります。 取得結果例 ID,NAME----列名 1,A 2,C 3,D SQL文をどのように作れば可能でしょうか? ちなみに、IDやNAMEのマスタテーブルはありません。 自分では、「(select ID, NAME, count(*) from USER group by ID, NAME) COUNT」で、COUNTを内部テーブルにして、グループ内で一番多いcount(*)をmaxで取得してみようかと思ったんですが、そこからアイデアが出ませんでした。

  • Accessで最小値と最大値を一度で取得する方法

    OS:WinXP Access:2000 下記の状態にしたいのですが よいSQL文が思いつきません。 MINのみのデータを抽出する方法は分かるのですが select ID,Name,Min(Date) from tblA group by ID,Name,Date MAX(Date)も出力しようとすると、Dateが最小のNameの出力方法が分かりません。 テーブル(tblA) ID|Name|Date --------------- 01|C |8/10 01|A |8/11 01|B |8/12 ↓ クエリ実行後 ID|MIN(Name)|MIN(Date)|MAX(Date) ----------------------------------- 01|C |8/10 |8/12 よろしくお願いいたします。

  • データをグループ分けするSQLを組みたいのですが

    メンバーを、各人の点数からグループ分けしたいと 考えています。 グループ分けの基準は、たとえば50点という尺度があり、 その尺度以上離れていたら別のグループとするというものです。 また、各メンバーの点数は最大と最小が登録されています。 現在は、VBでプログラムを作って対応しましたが、 最近、LAG/LEAD分析関数の存在を知ったので、それをうまく使えば、 SQLだけで対応できるのではないかと思えます。 SQLだけで対応できると、そのVIEWを作ってしまえば、ユーザーに 簡単に引き渡せるので管理が楽になります。 うまいSQLがあれば教えてください。 具体的な処理内容は以下の通りです。 例えば、TABLE1のようなデータで、グループ分けをすると ID=1と3の差が50点以内、3と2の差も50点以内なので、 その3名で1グループできます。 ID=4と5は、他と50点以上離れているので、それぞれ一人で 1グループになります。 ID= 6,7 は、差が50点以内なので、2名で1グループとなります。 結果として、TABLE2のような結果になります。 TABLE 1 ID MIN_SCORE MAX_SCORE 1 100 110 2 190 200 3 120 150 4 300 330 5 400 420 6 670 700 7 600 630 TABLE 2 CLASS MIN_SCORE MAX_SCORE N 1 100 200 3 2 300 330 1 3 400 420 1 4 600 700 2 そこに、TABLE1'のようなデータが加わると ID=4と8は差が50点以内で、7と8も差が50点以内なので、 そこらが全て同じグループになり TABLE 2' の結果となります。 TABLE 1' 8 380 550 TABLE 2' CLASS MIN_SCORE MAX_SCORE N 1 100 200 3 2 300 700 5 以上、よろしくお願いします

  • PEAR::Mailを使ったメール本文の書き方

    PEAR::Mailを使ってフォームからメール送信をしようとしていますが 本文となる部分の書き方がわかりません。 以前はこの正しいかどうかはわかりませんがPEAR::Mailを使わず $body .= "■名前:" .$_SESSION["sei"]." ".$_SESSION["mei"]. "\n"; $body .= "■カナ:" .$_SESSION["sei_kana"]." ".$_SESSION["mei_kana"]. "\n"; mb_send_mail( $mail_to, $subject, $body, $headers ); のように書いておりましたが、 今回はファイルの添付が複数必要になり楽に添付ファイルの送信が出来るとのことでPEAR::Mailをインストールして初めて使いました。 メールの添付はできたのですが、本文が以前のような書き方では送信できませんでした。 $body = "添付ファイルのテストです。"; $body = $_SESSION["sei"]. $_SESSION["mei"]."\n"; とするとエラーに $body = "添付ファイルのテストです。".$_SESSION["sei"]; としてもエラーになります。 同然間違った書き方なのでしょうけど、正しい書き方がわからず。 調べても対外が $body = "メール送信テスト" のような変数に対して簡単な1行の文字列のもばかりでようやく $sei = $_SESSION["sei"]; $mei = $_SESSION["mei"]; $body = <<< _EOT_ 添付ファイルのテストです。 $sei $mei _EOT_; のようにヒアドキュメントを使って送れるところまでは出来たのですが、今回送りたい項目がユーザー側の操作で増減し最大70項目あり、全てベタで書くのも大変なのでループ処理をしたいのですが、ヒアドキュメントの中には変数しか書けないようですし、どのようにしたら良いかがわからなくて困っています。 宜しくお願いします。

    • 締切済み
    • PHP
  • MySQLで特定のグループの上位3件を取得したい。

    ちょっと壁に当たったので、わかる範囲でお答え頂きたいのですが、 以下のようなテーブルがあったとします。 id user price date 1 A 1000 2013/5/31 2 A 1200 2013/6/1 3 B 1000 2013/5/20 4 A 1500 2013/5/12 5 C 1300 2013/5/31 6 C 1400 2013/5/14 7 C 1000 2013/5/6 8 B 1100 2013/5/24 9 B 1200 2013/5/30 10 B 1100 2013/5/4 11 A 1800 2013/4/12 12 C 900 2013/4/6 ・・・ 次に取得したいのは、 A 1200 2013/6/1 A 1000 2013/5/31 A 1500 2013/5/12 C 1300 2013/5/31 C 1400 2013/5/14 C 1000 2013/5/6 B 1200 2013/5/30 B 1100 2013/5/24 B 1000 2013/5/20 このようなデータなのですが、 条件: 1.userでグループ化したうちの日付降順で並べる 2.そのuserのデータの中で、日付降順で並べる 3.userのデータが複数あっても、取得するのは新しいものから3件のみ この条件を満たすSQL文はどのように記述すればよいか、お知恵をお貸し下さい。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • このSQL文の意味を教えてください。

    SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。

  • GROUP BY で列名は指定できないの?

    いつもお世話になっております。 SQLで GROUP BY を使うときに SELECT部分で指定した 列名を指定したいことがよくあると思います。 列名を指定する方法はないのでしょうか? 例) SELECT 項目A, CASE WHEN 項目B = 1 THEN '○' WHEN 項目B IN (2,3) THEN '×' END AS 丸バツ, SUM(数量) FROM TABLE GROUP BY 項目A, 丸バツ こんな風にGROUP BYで指定したいのですが・・・。

  • GROUP_CONCAT✕複数列で、違うレコード数

    MySQLで、「GROUP_CONCAT」を「複数列」に適用させ、それぞれ異なるレコードを1つにまとめようとしたのですが、 取得出来る結果が、多い方の数に引き連られてしまいます。 ざっくりとした質問でアレなのですが、これは結合の仕方が悪い、 と推測されるでしょうか? そもそも「GROUP_CONCAT」を複数列に適用させる場合、それぞれ異なるレコード数をまとまることはできるのでしょうか?。 ■期待した取得結果 [テーブルAカラムc] => tokyo,osaka [テーブルAカラムd] => japan,japan [テーブルBカラムe] => windows [テーブルBカラムf] => man ■実際の取得結果 [テーブルAカラムc] => tokyo,osaka [テーブルAカラムd] => japan,japan [テーブルBカラムe] => windows,windows [テーブルBカラムf] => man,man 「テーブルB」の取得結果が、「テーブルA」取得結果数に引き連られてしまいます ■SQL(抜粋) SELECT  GROUP_CONCAT(a.c) AS c,  GROUP_CONCAT(a.d) AS d,  GROUP_CONCAT(b.e) AS e,  GROUP_CONCAT(b.f) AS f FROM hoge h LEFT JOIN テーブルA a ON (h.id = a.hoge_id) LEFT JOIN テーブルB b ON (h.id = b.hoge_id)

  • 以下の場合のSQL文の書き方教えてください。

    2つのテーブルÅ、Bに同じ項目名(NYUSYA_DATE)が存在していて、 通常はAからデータを取得し、取得した値がNULLの場合は、Bから取得します。 これを1つのSQLで出来ますか? 今は、両方取得しておいて、IF文で判定しようとしています。 テーブルA SYAIN_ID (NOT NULL) NYUSYA_DATE テーブルB GROUP_ID (NOT NULL) SYAIN_ID NYUSYA_DATE