• ベストアンサー
  • 暇なときにでも

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; とするとエラーになります(当然)。 このような時って、どうすれば良いのでしょうか? 最近使い始めた素人ですので、宜しくお願い致します。

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

  • 回答数3
  • 閲覧数196
  • ありがとう数3

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

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

こんにちわ 同一の注文番号は必ず同じ金額である と言うのが揺ぎ無い条件であるのなら、 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' の方がスマートかと。 しかしこのテーブル、構造的に余り宜しくないですね(笑 受注番号と受注金額で別テーブルを作成すると言うのも一つの案ですよ。 それでは

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

質問者からのお礼

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

関連するQ&A

  • distinct をexistsに変換する

    distinctをexistsに変換した方がパフォーマンスが良いようで、 例えば以下の例があるとします ---------------------------------- (前)SELECT DISTINCT a.ID1, a.NAME1 FROM TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2 (後)SELECT a.ID1, a.NAME1 FROM TABLE1 a    WHERE EXISTS ( SELECT 'X' FROM TABLE2 b WHERE a.ID1 = b.ID2) ---------------------------------- もっと複雑なSQLの場合、EXISTSに変換できるのでしょうか?。複雑なSQLとは、 「複数のテーブルからカラムを取得」「テーブル結合が2つ以上」「外部結合」 などのSQLで、以下に例を示します。 (例)SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3    FROM TABLE1 a,TABLE2 b,TABLE3 c    WHERE a.ID1 = b.ID1(+)      AND a.ID1 = c.ID1(+)

  • DISTINCTの使い方を教えて下さい

    Select 文で DISTINCT を記述すると結果(Count)は-1となってしまいます。 DISTINCTを外すと全件表示されます。 これは何がまずいのでしょうか ? 環境 DB=SQLserver 2000 + IIS 5.0 + ASP 例:Select DISTINCT TABLE1,TABLE2,TABLE3 FROM TABLE ちなみにdbをAccess で使用している時とクエリアナライザではOKでした。

  • Select Distinctについて

    SQL文の質問です。フィールドがTable1に100つあるとします。 select distinct XYZ From Table1という文があるとします。 これだとXYZのフィールドしか参照していないことになると思います。 そうではなくて、他の99フィールドの値も参照(データにアクセスしたい)したいと思っています。 select distinct XYZ, * From Table1とSelect * from Table1みたいなことをやりましたがエラーが発生しました。他の99フィールドを参照する方法はあるでしょうか?

その他の回答 (2)

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

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

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

質問者からのお礼

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

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

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

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

質問者からのお礼

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

関連するQ&A

  • SQL文について

    テーブルの結合について教えてください。 (DBはオラクルです) select * from table1,table2 where table1.カラム名=table2.カラム名; で、結合が出来ることは分かりました。 やりたいことはテーブルの結合と、ある期間のデータを持ってきたいのです。 select カラム名 from table1 where カラム名 between '20020213' and '20020218'; で期間を決めて引き出すやり方も分かっています。 一度に結合と期間を決めて引き出すやりかたってどうすればよいですか? それとも不可能ですか? 教えてください。

  • このような結果が得られるSQL文はどのように書けばいいのでしょうか?

    お世話になります。 どなたかご教授下さい。 下記のようなテーブルが2つあります。 table1 ・customer_id ・fromdate ・todate table2 ・customer_id ・executedate ・amount やりたいことは、顧客([customer_id])ごとに集計期間(executedate between [fromdate] and [todate])が異なるのですが、 その顧客ごとの集計期間内における総数(sum([amount])を出したいのです。 ただ、どのようにSQLを書けばいいのか検討がつかないので、どなたかご教授いただければなと思います。

  • 配列を利用して表示されるテーブルを分けたいです

    PHP・MySQLを独学で利用しています。 以下のtable1のようなテーブルから各値を取り出して表示させたいのですが、特定条件でテーブル表示を分けることができないものか悩んでいます。 table1 ID・得意先コード・受注内容・受注金額・日付 1・   28  ・ xxxx ・ 10000 ・20080701 2・   32  ・ aaaa ・  5000 ・20080704 3・   28  ・ YYYY ・ 20000 ・20080706 4・   15  ・ tttt ・ 15000 ・20080709 5・   32  ・ kkkk ・  3000 ・20080801 (得意先コードはtable2のIDです) table2 ID・得意先名 15・ BBB 28・ CCC 32・ DDD フォームで指定した年月(2008年07月など)を条件に、table2とLEFTJOINした結果を取り出すまではfor文を利用して行うことができました。 得意先コード・受注内容・受注金額・ 日付 ・得意先   15  ・ tttt ・ 15000 ・20080709・BBB   28  ・ xxxx ・ 10000 ・20080701・CCC   28  ・ YYYY ・ 20000 ・20080706・CCC   32  ・ aaaa ・  5000 ・20080704・DDD これを以下のように得意先コードごとにテーブルを分けて表示することは可能なのでしょうか。 得意先コード・受注内容・受注金額・日付   15  ・ tttt ・ 15000 ・20080709 得意先コード・受注内容・受注金額・日付   28  ・ xxxx ・ 10000 ・20080701   28  ・ YYYY ・ 20000 ・20080706 得意先コード・受注内容・受注金額・日付   32  ・ aaaa ・  5000 ・20080704 最終的にはPXDocというソフトを利用して各テーブルのデータを得意先ごとにページ分けして印刷させたいのです。 まずは特定条件でデータを分けることができるかどうかがわからず、質問させていただきました。 お知恵をお借りできるとありがたいです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • SQL文 この部分はなんていうのでしょう?

    SELECT T_テーブル1.フィールド1 FROM T_テーブル1 ORDER BY T_テーブル1.フィールド1; なら、 ”ORDER BY句” SELECT T_テーブル1.フィールド1 FROM T_テーブル1 WHERE (((T_テーブル1.フィールド1)="A")); なら ”WHERE句” と言いますが、 DELETE Table1.* FROM Table1; や UPDATE テーブル1 Set テーブル1.フィールド1 = "い" WHERE (((テーブル1.フィールド1)=”あ")); や DROP Table Table1; の deleteやupdateやdropの部分は何て言うのでしょうか? そのまま、SELECT句DELETE句などというのでしょうか?

  • SQL文で

    SQL2000serverで 異なる2つのデーターベースの中にある 別のテーブルの情報を SQL文を使って、抽出する事は出来るのでしょうか? たとえば下記のように「DB-A」「DB-B」と言った 二つのDBの中のそれぞれのテーブルのIDフィールドで リレーションを取ってDB-AのTablA1のFldAの 値(AA)からDB-BのTablB1のFldBの値(あ)を 抽出することはSQL文で可能なのでしょうか? DB-A DB-B TablA1 TableB1 ID FldA ID FldB 1 AA 1 あ 2 BB       2 い 3 CC 3 う 4 DD 4 え

  • 分岐SQLを一発のSQLで実現したい

    【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD Table2 種類、キー1、キー2 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD Table3 種類、キー1、キー2 NULL  AAA  BBB NULL  AAA  CCC NULL  AAA  DDD これをUNIONで取得します。 種類、キー1、キー2 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD NULL  AAA  BBB NULL  AAA  CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001  AAA  BBB 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD →いる NULL  AAA  BBB →いらない NULL  AAA  CCC →いらない ↓結果 001  AAA  CCC 001  AAA  DDD 002  AAA  BBB 002  AAA  CCC NULL  AAA  DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。

  • 一つのSQLで実行できるでしょうか?

    sqliteで質問です。 今、以下のようなテーブル(table1)があったとします。 uid | date | comment 010 | 1211 | AAAAA 011 | 1211 | BBBBB 010 | 1220 | CCCCCC 011 | 1220 | DDDDDD このとき、1行目と4行目を取得や削除するようなSQLを一つで記述することは可能でしょうか? イメージてきには、 select * from table1 where {((uid = 010) and (date = 1211)), ((uid = 011) and (date = 1220))} みたいな感じにです。 つまり、where句の組み合わせを複数書いて一つのSQLで実行したいのです。 恐れ入りますが、よろしくお願いします。

  • ACCESS 以下のように変更するSQL式を教えて

    Microsoft Accessで以下のように変更するSQL式を教えてください。 (Windows10 , Access2016) 以下のようにテーブル(TABLE1)には、 A,B,Cの3つのフィールドがあり Aには番号が入っています。重複した番号もあります。 Bには0~9までのいずれか1つの数字が入っています。 Cにはa,b,cのいずれか1つの文字が入っています。 Aの各値に対してBの値が0のレコードは1個だけです。 (例)TABLE1   A  B  C   1  0  a   1  9  b   1  2  c   2  1  b   2  3  a   2  0  c   2  7  c   3  1  a   3  0  b    :   :   :  999  0  a    :   :   : このようなテーブル(TABLE1)に対して、 Aの各値毎に、 Bの値が0以外のレコードのCの値を Bの値が0のレコードのCの値に変更する SQL式 (ACCESSのクエリデザインのSQLレビューのSELECT;の所に入力する UPDATE TABLE1 SET C=…;のような式) を教えてください。 (例) 変更後のTABLE1   A  B  C   1  0  a   1  9  a   1  2  a   2  1  c   2  3  c   2  0  c   2  7  c   3  1  b   3  0  b    :   :   :  999  0  a    :   :   :

  • テーブルの集計値を別テーブルに更新したいのですが

    mysql+PHPを利用していますが、表記の件で数日間悩んでおります。 実際に可能な操作かどうかもわかりません。 よいお知恵があったら教えてください。 下のようなテーブルがそれぞれあります。 table1 ID・得意先コード・受注内容・受注金額 1・   28  ・ xxxx ・ 10000 2・   32  ・ aaaa ・  5000 3・   28  ・ YYYY ・ 20000 4・   15  ・ tttt ・ 15000 5・   32  ・ kkkk ・  3000 (得意先コードはtable2のIDです) table2 ID・得意先名・受注金額合計 15・ BBB・ 28・ CCC・ 32・ DDD・ PHPファイルを実行する度に、 「table1」の「受注金額」を「得意先コード」ごとに集計した各値を、「table2」の各「受注金額合計」にそれぞれ更新していきたいと思っています。 色々調べたところ以下の構文が紹介されていたので試してみました。 Update table2 set 受注金額合計 = (select sum(受注金額) from table1 INNER JOIN table2 ON table1.得意先コード = table2.ID) すると「#1064 - You have an error in your SQL syntax」というエラーが出てしまいました。select以降の構文が良くないらしいのですが、私の書き方が悪いのか、それすらもわからない状態です。 MySQLは4.0.24、PHPは4。レンタルサーバーを利用しています。 なにとぞよろしくお願いします。

  • SQLを教えて下さい

    SQL文を教えて下さい 以下の2つのテーブルがあります。 TABLE1 --------------- ID,NAME,PRICE --------------- 1,部品A,100 2,部品B,200 3,部品C,300 TABLE2 --------------- ID,NAME,PRICE --------------- 1,部品Aのサブ1,1 1,部品Aのサブ2,2 2,部品Bのサブ1,5 2,部品Bのサブ2,5 --------------- SELECT TABLE1.NAME TABLE2.NAME TABLE1.PRICE TABLE2.PRICE WHERE TABLE1.ID = TABLE2.ID(+) TABLE2.PRICE = (SELECT MAX(?) ?) 期待する結果 ・TABLE1.NAME = 部品Aの場合 --------------- 部品A,部品Aのサブ2,100,2 ・TABLE1.NAME = 部品Bの場合 --------------- 部品B,部品Bのサブ1,200,5 TABLE1.NAME = 部品Cの場合 --------------- 部品C,,300, ・TABLE1のNAMEに、TABLE2のNAMEが関連付く(付かないものもある) ・外部結合とMAX関数を用いたい。 ・TABLE2のPRICEが大きい方を取得(同一の場合は、どちらかを取得)