• ベストアンサー
  • すぐに回答を!

SQL HAVING句?集約関数について

SQL HAVING句?集約関数について 現在、SQLを書いているのですが、集約関数についてわからないことがあります。 下記のようなテーブルについて   品番    SEC   SUB 倉庫コード 日付 金額 0102A255-****10000141220064201005015700 0102A255-****10000141220064200912267980 0102A255-****10000141220064200910019400 品番をひとつに絞り、かつ最新日付とその金額をもってくるためにはどうしたらいいでしょうか? ようは一番上のレコードのみ抽出したいということです。 どなたかお願いします。

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

  • 回答数2
  • 閲覧数828
  • ありがとう数21

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

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

集約しないといけないのですか? それとも、行の先頭だけ出せば良いのですか? 同じ品番の先頭行だけ出せば良いのなら SELECT DISTINCT * FROM テーブル名 WHERE 品番 = '0102A255-****100001' ORDER BY 日付 asc; とか・・・。 HAVING句は、GROUP BYで纏めた値とかの抽出に使います。 http://www.pursue.ne.jp/jouhousyo/SQLDoc/select15.html

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

質問者からの補足

すみません。 詳しく書くとかえってわかりにくくなると思い、割愛させていたできました。 上記テーブルのデータはすでにいくつかのテーブルを結合し、必要最小限なデータまでGROUP BYで絞りこんだ状態です。 上記テーブル内にはひとつの品番しか書きませんでしたが、 本テーブルには同じように金額と日付以外が同じデータがいくつも存在します。 そのテーブルから品番はユニークなものしてなおかつ、日付がもっとも新しいデータだけを抽出したいのです。 この段階から方法があるかどうかわかりませんが、理想としては HAVING句でその品番について日付 = 最新日付で返されるデータのみが欲しいということになります。 なにか方法はあるでしょうか?

関連するQ&A

  • SQL MAX関数を検索条件にする。

    SQL MAX関数を検索条件にする。 わかる方がいれば助けてください。 下記のようなデータのテーブルあります。   ID        品番      金額          日付 OUTLET 210   00182-1080   5600         20090915 OUTLET 214  00182-1080   5600         20090916 OUTLET 217  00182-1080   5600         20090917 OUTLET 50  00182-1080   5600         20090609 OUTLET 437  00191-1082   3300         20100305 BLK09SS703  00191-1082   5500         20090703 OUTLET 141  00191-1082   5500         20090717 OUTLET 170  00191-1082   5500         20090806 このテーブルデータの各品番について最新日付のデータのみを出力したいのですが、 方法がわかりません。group byでHAVING検索なども試しましたがうまくいきませんでした。 <抽出したいデータ>   ID        品番      金額          日付 OUTLET 217  00182-1080   5600         20090917 OUTLET 437  00191-1082   3300         20100305 どなたかお願いします。 前にも同じような質問をさせていただきましたが、 解決できずにこまっています。

  • SQLで集計キー毎の最大値を求めたい

    下記の品番テーブルを元に抽出結果「会社別発売日最新品番一覧」を得るためのSQLがわからなくて困っています。どなたかアドバイスいただけないでしょうか。よろしくお願いします。 品番テーブル 会社 品番 発売日 -------------------------- 1 A 2/11 1 B 8/18 2 C 3/10 3 D 7/14 3 E 8/10 3 F 9/11 4 G 1/31 4 H 6/25 抽出結果「会社別発売日最新品番一覧」 -------------------------- 会社 品番 発売日 1 B 8/18 2 C 3/10 3 F 9/11 4 H 6/25

  • SQLチューニングについて

    以前別のサイトで質問し、一旦は解決したつもりでしたが、クライアントから再度条件を 突きつけられてしまい、投稿させて頂きました。 (そちら側のサイトでは完了にしてあります。これがマルチスレッドにあたるならご指摘下さい。) -------------------------------------------------------------------- 現在ACCESSにてデータ出力を行なっておりますが、パフォーマンスが出なく悩んでおります。 環境:Windows XP + Access 2003 テーブルA(約18000件) 項目s 項目t 項目u 項目v ★やりたいこと  テーブルAのうち、項目s,t,uを集約して、集約結果が1件のものを  対象に全ての項目(s&#65374;v)を出力したい。 ★現在作成中のSQL SELECT sub02.s, sub02.t, sub02.u, sub02.v FROM テーブルA AS sub02 INNER JOIN ( SELECT s, t, u FROM テーブルA GROUP BY s, t, u HAVING COUNT(s) = 1 ) AS Sub01 ON Nz(sub01.s)=Nz(sub02.s) AND Nz(sub01.t)=Nz(sub02.t) AND Nz(sub01.u)=Nz(sub02.u) 上記SQLで実行すると8&#65374;10分程度掛かってしまいます。 結合条件のNZ関数については、どうしてもnullが入る項目がある為に この様にしてしております。 どなたかお知恵を拝借願いたいと思います。

その他の回答 (1)

  • 回答No.2

今作っているSQLが分からないとHAVING句をどのように使用すればいいか分からないと思います。 元がテーブルなら select * from テーブル t where not exists ( select 1 from テーブル t2 where t.品番 = t2.品番 and t.日付 < t2.日付 ) の要領で最新日付のものを取得出来ると思うのですが。 参考になりませんか?

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

関連するQ&A

  • SQLのsum関数

    こんにちは。 PostgresのSQLが思うように動いてくれません!! そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。 テーブルは下記です。 ********************************************* ★Aテーブル ID  名前  数  場所  日付 0001 みかん 1  冷蔵庫 0901 0001 みかん 4  倉庫  0901 0001 みかん 1  冷蔵庫 0901 0002 いちご 1  部屋  0901 0002 いちご 2  部屋  0801 0003 きのこ 6  倉庫  0901 ★Bテーブル ID  名前 0001 みかん 0002 いちご 0003 きのこ 0004 あいす ********************************************* となっている場合、下記SQLを実行すると select a.ID ,b.名前 ,sum(a.数) as 数 from Aテーブル a,Bテーブル b where a.日付 >= '0901' and a.日付 <= '0901' and a.ID = b.ID group by a.ID ,b.名前, a.数 結果が 0001 みかん 2 0001 みかん 4 0002 いちご 1 0002 いちご 2 となり0001は合計6で出て欲しいのに別々に出てしまいます。 理想では 0001 みかん 6 0002 いちご 3 で出て欲しいです。 たとえばこの場合、場所によってなど出てしまうものでしょうか? これはなぜなのでしょうか? よろしくお願いします。

  • SQLのUPDATE文(WHERE)で教えて下さい

    SQLのUPDATE文(WHERE)で教えて下さい SQL初心者なのですが、どなたか教えて頂けないでしょうか・・・。 Oracle10gにSqlPlusで接続してテーブルをUPDATEしようとしています。 【テーブル1】 品番、 規格、 取引先、 日付 A1   XXX  T001   2010/01/01 A1   YYY  T002   (空白) B1   XXX  T001   (空白) C1   ZZZ  T003   (空白) 【テーブル2】 品番、 規格、 取引先、 備考 A1   XXX  T001   あああ A1   YYY  T002   いいい B1   XXX  T001   ううう テーブル1の「日付」が(空白)のレコードを対象に、 テーブル1の「品番+規格+取引先」とテーブル2の「品番+規格+取引先」が同じな場合、 テーブル1の「日付」項目に今日の日付をUPDATEしたいと考えています。 結果を以下のようにしたいです。 【テーブル1】 品番、 規格、 取引先、 日付 A1   XXX  T001   2010/01/01 A1   YYY  T002   2010/03/19 B1   XXX  T001   2010/03/19 C1   ZZZ  T003   (空白) これが実現できるSQL文を教えて下さい。 宜しくお願い致します。

  • SQLで集計について分からないことがあります。

    SQLで集計について分からないことがあります。 まず、次のようなテーブルがあったとして 日付  店舗コード ブランドコード 金額 ---------------------------------------- 09-01 | 401101 | 01 | 10000 09-02 | 401101 | 01 | 20000 09-03 | 401101 | 01 | 30000 09-04 | 401101 | 01 | 40000 09-01 | 401101 | 02 | 10000 09-02 | 401101 | 02 | 20000 09-03 | 401101 | 02 | 30000 09-04 | 401101 | 02 | 40000 09-01 | 401101 | | 11111 09-02 | 401101 | | 22222 09-03 | 401101 | | 33333 09-04 | 401101 | | 44444 ブランドコードが'Null'の金額をブランドコードが'01'の金額に 日付をキーにして集計したいんですが、 可能でしょうか? なにか、良い方法があればお願いします。

  • ビュー(インラインビュー)で集約した結果と結合するSQLについて

    テーブルAを複数のキー項目で集約した結果と、テーブルBを結合しようとしています。 インラインビュー(もしくはビュー)で予め集約を行う、以下のようなSQLを考えました。 候補<1> MAX関数でTableA.列1を絞る select ... from (select max(列1),列2,列3,列4 from TableA group by 列2,列3,列4) TableA2,Table_B where TableA.列2=TableB.列2 and ...; 候補<2> ROW_NUMBER関数で列1の順位を取得し、Where句で順位=1とすることでTableA.列1を絞る select ... from (select 列2,列3,列4 from TableA group by 列2,列3,列4 row_number() over (partition by 列2,列3,列4 order by 列1) RN) TableA2,Table_B where TableA.列2=TableB.列2 and ... and RN=1; ※候補<1><2>で結果が異なることがありますが、ともかく 「インラインビュー(もしくはビュー)で予め集約を行う」がやりたいことです。 しかしこのようなクエリだと、インラインビューでもビューでも、 性能がでません。実行計画を確認したところ、TableA,TableBの結合で生成される レコードごとに毎回集約を行っているようで、膨大なクエリ数が発生していました。 ビューやインラインビューで上記のように集約を行うと危険、とはよく聞きますが... ビューやインラインビューで集約した結果をひとつのテーブルとみなして結合するなど、 レコードごとに集約を行わないようなノウハウがありましたら、お教え願います。

  • sql 集計結果の抽出方法を教えてください

    金額テーブル(会社名、金額)と詳細テーブル(会社名、日付、金額)があり 金額テーブル A社 100円 詳細テーブル A社 2011/1/1 10円 A社 2011/1/2 10円 A社 2011/1/3 50円 A社 2011/1/4 20円 A社 2011/1/5 10円 A社 2011/1/6 10円 詳細テーブルの金額を一件づつ合計していき、金額テーブルの金額を超えた時の 詳細テーブルの日付を抽出するSQLを教えてください。 上記データの2011/1/5を抽出したいのです。 宜しくお願いします。

  • SQLについて

    お世話になります。 いろいろ考えたのですが、わかりません。 教えてください。よろしくお願いします。 ●現在のSQLは SELECT 仕入先コード, 支払予定日, SUM(金額) FROM 仕入検収テーブル GROUP BY 仕入先コード,支払予定日 ●テーブルの構成は 仕入検収テーブル  仕入検収番号   (主キー)  仕入先コード  支払予定日  部門番号  金額 ●テーブルデータは 仕入検収番号 仕入先コード 支払予定日 部門番号 金額 1 0001000 2004/06/15 10 3000 2 0001000 2004/06/15 11 7000 3 0002000 2004/06/16 10 20000 4 0001000 2004/06/17 10 1000 上記のようなテーブルの時に 現在は仕入先コードと支払予定日ごとに集約されているのですが、その集約された仕入先コードを用いてその仕入先コードは過去に仕入検収テーブルに登録されていたら備考という項目に「新規」と表示したいのです。 ●実現したい実行結果は 支払予定日 仕入先コード 金額 備考 2004/06/15 00010000 10000 新規 2004/06/16 00020000 20000 新規 2004/06/17 00010000 1000

  • デルファイでのSQL文について

    まだ初心者なのでよく分かりません。SQL文について教えてください。 テーブル名:table1 データ:   コード   日付     種類   備考 (1) 1111   2003/12/11  book  AAA (2) 2222   2003/11/10  pencil BBB (3) 2222   2003/12/10  pencil CCC (4) 2222   2003/12/20  cap   DDD 上のようなデータがあった場合、コードと種類が同じで日付が最新のデータを取りたいのですがSQL文でできるでしょうか? 上の場合だと(1)と(3)と(4)のデータを抽出したいのです。GROUP BYですると備考がとれませんでした。 どうぞよろしくお願いします。   

  • 効率の良いSQL文の書き方を教えてください

    MySQLで開発をしています。 1回のSQLで、下記テーブルの内容を日付・ユーザ番号毎(日付・ユーザ番号が同じ時に同じレコード)に、 型番1個数、 型番2個数、 その他が2か3で型番2・品番1個数、 その他が2か3で型番2・品番1個数、 その他が2か3で型番2・品番1での売上小計、 その他が2か3で型番2・品番2個数での売上小計、 売上合計、 以上の各カラムを持つテーブルに再編して返したいのですが、 効率の良いやり方がわかりません。 どなたかよろしくお願いします。 テーブル ユーザ番号 日付   型番  品番   売上  その他 &#65293;&#65293;&#65293;&#65293;&#65293; &#65293;&#65293;&#65293; &#65293;&#65293;&#65293; &#65293;&#65293;&#65293; &#65293;&#65293;&#65293; &#65293;&#65293;&#65293;  001     3/10    1    2     500    1  001     3/10    2    1      0    1  003     3/11    2    1     100    2  004     3/12    1    1     100    2  005     3/12    2    2      0     2  001     3/13    1    2     500    1  003     3/13    2    1     100    2  003     3/13    2    1      0     3  002     3/14    1    1     100    3  005     3/15    2    2     0      1

  • SQL文の副問合わせについて

    いつも勉強させて頂いています。 SQLの副問合わせでわからないところが出て来ましたので、教えて頂けると助かります。 <環境> VB 2008 SQLSERVER 2005 <内容> 金額の集計をしたいのですが。 テーブルA 品番(主キー) 品名 予測金額 テーブルB 品番(キー)  品名 確定金額 テーブルAの品番に対してテーブルBのレコードが1対多の関係です。 <結果> 品名に「あ」を含むもの、 テーブルAのCOUNT、 テーブルBのCOUNT、 予測金額合計、 確定金額合計 上記結果で出力したいのですが、困っています。 宜しくお願い致します。         

  • SQLで、指定日条件のSQL文

    MySQLを使っています。 商品テーブルの中で、 同じ商品のレコードが複数あります。 その多数のレコード中に、日付項目があります。 そこから、 1)商品IDで重複せずに、2)指定日に、3)一番近い過去の日、4)指定日を含めて、複数ある未来の全レコード、を抽出するには、 どのようなSQL文を書けばよいでしょうか? 商品でユニークになるように、 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 2.未来に複数ある日付の中の、全ての未来の、レコード。 3.同一商品レコードは、複数抽出されない。