• ベストアンサー

SQL文でのDISTINCT

皆さん、はじめまして。 表題の件について、お分かりの方教えて下さい。 まず、テーブルですが テーブル名:table1 得意先CD 得意先名 受注番号 枝番 受注金額 custcd   custnm  jychuno  edano  amount -------------------------------------------- 000001   AAAAAAA 0000001  01   111111 000001   AAAAAAA 0000001  02   222222 000001   AAAAAAA 0000002  01   333333 000002   BBBBBBB 0000001  01   444444 のような、取引明細テーブルがあったとします。 ご覧頂いてお分かりの通り、得意先CD毎に受注番号が振られていて さらに枝番で管理されています。 (枝番が全て01から始まれば、それだけ選べば良いんですが・・・) この時、同一得意先で受注番号が重複するデータは省きたいのですが どうDISTINCTを入れれば良いのか分かりません。 上記例では、2行目だけを省きたいのです。 SELECT custcd , custnm , DISTINCT juchuno , edano , amount FROM table1 ORDERBY custcd , custnm , jychuno , edano; とするとエラーになります(当然)。 このような時って、どうすれば良いのでしょうか? 最近使い始めた素人ですので、宜しくお願い致します。

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

  • ベストアンサー
  • sueoka
  • ベストアンサー率38% (24/62)
回答No.3

こんにちわ 同一の注文番号は必ず同じ金額である と言うのが揺ぎ無い条件であるのなら、 2ndさんのSQLをちょっと改造して、 SELECT custcd, suctnum, juchuno, max(amount) FROM table1 GROUP BY custcd, custnum, juchuno; で出来ますよ(もちろん、minでもOK)。ただし、お勧めはしません。 その理由は、「他の人がこのSQLを見たときに、何をやりたいのかが分からなくなる」 からです。 又は、「枝番」は必ず01から始まると言うことであれば、 SELECT custcd, custnum, juchuno, amount FROM table1 WHERE edano = '01' の方がスマートかと。 しかしこのテーブル、構造的に余り宜しくないですね(笑 受注番号と受注金額で別テーブルを作成すると言うのも一つの案ですよ。 それでは

yoshibu30
質問者

お礼

おぉ~っ、どうせ同一値ならmaxで取れってですか(目から鱗 確かにこれなら、いけるかも!?試してみます。 枝番は、下にも書いた通り01から始まる訳では無いんです。 ったく、うちのテーブル構造に問題があるっちゅーねん、ぶつぶつ・・・(笑 有難う御座いました。 これからもお願いします。

その他の回答 (2)

  • 2nd
  • ベストアンサー率30% (19/63)
回答No.2

今ひとつ何をなさりたいのか、判りかねるのですが こんな SQL は的外れでしょうか? SELECT custcd,custnum,juchuno, sum(amount) FROM table1 GROUP BY custcd,custnum,juchuno;

yoshibu30
質問者

お礼

2ndさん、回答ありがとうございます。 やりたい事を要約しますと、 「同一受注番号に対して、複数存在する枝番レコードは省きたい。  理由:同一受注番号には、複数の枝番レコードが存在し、各々のレコードに     その受注での合計金額(当然全て同じ金額)が入っている為」 です。 そういう意味では、質問でのテーブル内容は誤りで、2行目には111111が 入っているという訳です。 これは足さずに、1行目・3行目・4行目のamountの合計を取りたい! というのがやりたい事です。 その時、group by を使ってしまうと、amount が取れなくなってしまいますよね? それで悩んでいるのです。 何か良い方法がありましたら、教えて下さい。

  • misoka
  • ベストアンサー率35% (56/160)
回答No.1

こんにちは。 そういう場合は、「グルーピングする」と言います。 ですから、この場合、GROUP BYを使うのが正解のはずです。 ただし、edabanとamountはselectできませんよ。 グルーピングと矛盾しますから。

yoshibu30
質問者

お礼

misokaさん、早速の回答有難う御座います。 おっしゃる通り、グループ化すると、edabanとamountがselect出来なくなりますよね。 欲しいデータは、amountなんです。 この合計を取りたいんですよ。 副問い合わせを利用してとか、色々考えたんですが、やっぱりsqlだけでは無理があるんですかねぇ? やっぱり、取り込んだデータを再加工する方法で考えるしか無いんでしょうか?

関連するQ&A

  • SQLである条件の重複を抽出する方法は無いでしょうか?

    下記のようなAというテーブルがあったとします。 A1 A2 A3 A4 A5 A6 A7 ------- ------- ------- ------- ------- ------- ------- AAAAAAA BBBBBBB CCCCCCC DDDDDDD EEEEEEE FFFFFFF GGGGGGG AAAAAAA BBBBBBB XXXXXXX YYYYYYY EEEEEEE FFFFFFF GGGGGGG ABCSHSM SDIASNA SIASJAO OPPPPPP YGUUUBU NINIINI LPLPLPL この中でカラム「A1」and「A2」and「A5」and「A6」and「A7」が重複しているレコードを抽出させるにはどうしたらいいでしょうか? いろいろやってみているのですが行値式が使えないDBです。 レコードの数も10万くらいあるので出来るだけ早めに抽出が出来ればいいのですが・・・ 調べてみてもいるのですがなかなか重複を抽出されている方が少なく(重複の削除→DISTINCTは多いのですが・・・)困っております。 よろしくお願いします。 ちなみにDELETEはしません SELECTのみです。 9i

  • SQLについて

    お世話になります。 まず実現したいことを書きます。 DBテーブル内容 受注テーブル 受注番号 案件番号 得意先コード 1      1      0001 2      1      0001 3      1      0001 4      2      0002 5      2      0002 6      3      0003 7      4      0001 8      5      0003 のようにデータが入っている時に 受注番号 案件番号 得意先コード 1      1     0001 2      1     null 3      1     null 4      2     0002 5      2     null 6      3     0003 7      4     0001 8      5     0003 このように取得したいのですが、 (案件番号と得意先コードが一致している時は一番上に だけ得意先コードを表示それ以外はnullをセットする) いろいろ考えたのですが、まったくわかりませんでした。 どなたかアドバイスをお願いします。 よろしくお願いします。

  • 無視されるdistinct

    お世話になります  大規模商談をまとめた営業のリストを作るSQLを書こうとしています。   営業部員テーブル (test.person) id | name ----+------ 1 | 山田 2 | 高橋 3 | 田中 商談テーブル (test.deal) id | person_id | customer | amount ----+-----------+----------+-------- 1 | 1 | XX商事 | 20000 2 | 3 | BB電機 | 10000 3 | 2 | ZZ不動産 | 2000 4 | 1 | RR証券 | 8000 期待している検索結果 name | amount | customer ------+--------+---------- 山田 | 20000 | XX商事 田中 | 10000 | BB電機 高橋 | 2000 | ZZ不動産 下記のようなSQLを書きました。 select distinct name,amount,customer from test.deal,test.person where person.id=deal.person_id order by amount desc  しかし、nameをdistinctしているにもかかわらず、結果は下記の通り、「山田」が重複しています。 name | amount | customer ------+--------+---------- 山田 | 20000 | XX商事 田中 | 10000 | BB電機 山田 | 8000 | RR証券 高橋 | 2000 | ZZ不動産 いろいろと調べて、group by を使えばいい、というようなやり方を示している例も多かったのですが、それもうまくいきません。(必要であれば載せます) 期待通りの結果を得るにはどのようなSQLを書けばよろしいでしょうか。 よろしくお願いいたします。

  • SQLでの集計結果取得について

    以下のようなSQLを書いたのですが,ほしい結果が得られませんでした。 受注に存在しない得意先についても得意先コードと得意先名を得たかったので、 "from 受注 Right Outer Join 得意先 On 受注.得意先コード = 得意先.得意先コード" としたのですが, 受注に存在しない得意先についてはデータが得られませんでした。さらに、Where句で、"受注.得意先コード =* 得意先.得意先コード"と書くとエラーが出てきてしまいました。 どうすれば得意先に存在する得意先すべての集計結果が得られるのでしょうか? String sql = "Select 得意先.得意先コード, Min(得意先.得意先名) " + "As 得意先名, Sum(受注.受注合計金額) " + "from 受注 Inner Join 得意先 " + "On 受注.得意先コード = 得意先.得意先コード " + "where 受注.得意先コード = 得意先.得意先コード " + "and 受注状態区分 = '" + joutaiKubun + "' " +      "and 納入日 between '" + startYMD + "' and '" +        "endYMD + "' " + "Group By 得意先.得意先コード " +      "Order By 得意先.得意先コード ";

    • ベストアンサー
    • Java
  • SELECT DISTINCTとWHERE

    アクセス2010 テーブルAから、右2文字の重複しないテーブルBをつくり、さらにさらにテーブルBとも重複しない左2文字のテーブルCをつくりたい。 テーブルA [F00] ABCD ABAB EFGH IJGH INSERT INTO テーブルB (F1) SELECT DISTINCT Left([F00],2) AS F1 FROM テーブルA  テーブルB [F1] AB EF IJ (うまくいきました) INSERT INTO テーブルC (F1) SELECT DISTINCT Right([F00],2) AS F1 FROM テーブルA,テーブルB WHERE テーブルB.F1<>Right(テーブルA.F00,2)  (うまくいきません) 下記のようにしたいのですが。 テーブルC [F1] CD GH

  • SQLについて

    SQL初心者です。ご質問させていただきます。 得意先マスタ(得意先CD、得意先分類CD、得意先名)←T [得意先分類CDは重複] 得意先分類マスタ(得意先分類CD、得意先分類名)←B 売上履歴(得意先CD、売上金額)←U というようなマスタが存在した場合に得意先分類CDで集計して、 (得意先分類CD、得意先分類名、売上金額)というようなデータを抽出したくて、下記のようなSQLを作成したのですが、うまくいきません。 SELECT U.得意先分類CD,B.得意先分類名,U.売上金額 FROM T,B,U WHERE T.得意先CD = U.得意先CD AND T.得意先分類CD = B.得意先分類CD GROUP BY B.得意先分類CD  よろしくお願いいたします。

  • データベースの正規化について質問です><

    データベースの正規化について質問です><教えて下さい。 伝票を正規化していく問題なのですが、 受注番号 受注日 得意先コード 得意先名 得意先住所 {商品コード 商品名 販売単価 受注数量 受注金額} {}は繰り返しを表します。 これをまず自分で第一正規化してみて//*は主キーを表す。 *受注番号 受注日 得意先コード 得意先名 得意先住所 *商品コード 商品名 販売単価 受注数量 受注金額 になり次に第二正規化してみて *受注番号 受注日 得意先コード 得意先名 得意先住所 *商品コード 商品名 販売単価 *受注番号 *商品コード 受注数量 受注金額 になり最後に第三正規化をして *受注番号 受注日 得意先コード *得意先コード 得意先名 得意先住所 *商品コード 商品名 *商品名 販売単価 //ココです。 *受注番号 *商品コード 受注数量 受注金額 となったのですが模範解答には//ココです。の部分がなく、*商品コード 商品名 販売単価 これのままで終わっていました。 自分が間違えているのでしょうか??もし間違えているなら理由を教えて下さい。長くてすいません

  • 集計についてのSQLの組み立て方

    SQLについての質問です。 MySQLを使っています。 1か月間の得意先別の入金の集計を取りたいと思っています。 表としては以下のような感じです。 ID  得意先名  現金計 振込計 相殺計 手数料計  合計 =========================================================== 001 aaaaaaa   30,000  40,000  25,000    840  95,840 002 bbbbbbb   10,000  20,000  30,000    420  60,420 SELECT * sum(nyukin) AS genkin FROM nyukin_meisai WHERE tokuisaki_id = '001' AND nyukin_kubun = '現金' AND uriage_bi BETWEEN '2014/05/01' AND '2014/05/31' SELECT * sum(nyukin) AS furikomi FROM nyukin_meisai WHERE tokuisaki_id = '001' AND nyukin_kubun = '振込' AND uriage_bi BETWEEN '2014/05/01' AND '2014/05/31' 以下続く と得意先毎/各区分ごとに一つひとつSQLを発行すればできるんでしょうけど、 これをひとつのSQLで実現したいと思っていますがSQLをどのように組み立て てよいものやら困っています。 case を組み込んだりしてもうまくいきませんでした。 どなたかご指導下さい。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLで合計表示

    SQLで合計・総合計を出してたいのですが、どうしたらいいのですか? 教えてください 下記はこのような感じでデータベースがあった場合です 得意先:T_得意先.得意先番号 得意先名称:T_取引先.得意先名称 T_受注.工場番号 = T_取引先.取引先番号 T_受注.品目番号 T_受注.品目名 T_区分明細.区分明細名 T_受注.受注番号 T_受注.受注日 T_受注.納期 T_受注.受注数 T_受注.単位名 T_受注.単価  T_受注.仮単価区分  T_受注.金額  T_担当者.担当者名 --番号で名称を結合 品目名 = (T_品目.品目番号 = T_受注.品目番号) 単位名 = (T_単位.単位番号 = T_受注.単位番号) 担当者名 = (T_担当者.担当者番号 = T_受注.担当者番号) -------------------- 得意先合計:得意先ごとの「金額」合計 総合計:全得意先の「金額」合計

  • Accessでクエリを作った際の順番

    Access2003の質問です。 以下のテーブルがあってそれらの項目を抜き出してクエリを作っています。 テーブル1 ・商品CD ・商品名 ・単価 テーブル2 ・No ・売上日 ・得意先CD ・商品CD ・数量 テーブル3 ・得意先CD ・得意先名 ・フリガナ ・郵便番号 ・住所 ・TEL ・担当者CD ・DM テーブル4 ・担当者CD ・担当者名 クエリ ・No(テーブル2) ・売上日(テーブル2) ・得意先CD(テーブル2) ・得意先名(テーブル3) ・担当者CD(テーブル3) ・担当者名(テーブル4) ・商品CD(テーブル2) ・商品名(テーブル1) ・単価(テーブル1) ・数量(テーブル2) クエリを作って、データシートビューに切り替えるとなぜか得意先CDで昇順に並んでいます。 もちろんNoで並べ替えを設定すれば、Noで並べ替わるのですが、なぜ得意先CDで昇順に並ぶのでしょうか? Noが一番左にあるので、Noで並べ替わりそうなものですが・・ 何も並べ替えを設定しないとどのような基準で並ぶのでしょうか? わかる方がいれば教えてください。