• ベストアンサー
  • 困ってます

HAVING句でのBETWEEN演算子

HAVING句でのBETWEEN演算子の使い方について教えていただけますでしょうか。 MS SQL SERVER のフロントエンドとしてMS ACCESS でパススルークエリを作成中です。 以下のようなテーブルがSQL SERVERにあります。 ID    TIME AAA   2005/06/01 00:00:10 BBB   2006/02/01 00:00:10 CCC   2006/03/01 00:00:10 AAA   2006/02/01 00:00:10 BBB   2006/02/02 00:00:10 CCC   2006/03/02 00:00:10 MS ACCESS パススルークエリで以下のようなSQL文を作成しました。 SQL文 SELECT ID, TIME FROM JOB WHERE TIME between '2006/01/01 00:00:00' and '2006/02/15 23:59:59' 結果 ID    TIME BBB   2006/02/01 00:00:10 AAA   2006/02/01 00:00:10 BBB   2006/02/02 00:00:10 抽出条件は TIME between '2006/01/01 00:00:00' and '2006/01/31 23:59:59' のままとし、IDをグルーピングしたいと思い以下のように書き換えましたが正しい記述では無いようでエラーとなってしまいます。 SELECT ID, TIME FROM JOB GROUP BY CODE HAVING TIME between '2006/01/01 00:00:00' and '2006/01/31 23:59:59' ORDER BY ID 欲しい結果 ID AAA BBB 正しい記述を教えていただけますでしょうか。 よろしくお願いいたします。

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

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

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

  • ベストアンサー
  • 回答No.2
noname#22222
noname#22222

例えば、次のようなJOBのデータがあるとします。 IIDTime 1AAA2005/06/01 0:00:10 2BBB2006/02/01 0:00:10 3CCC2006/03/01 0:00:10 4AAA2006/02/01 0:00:10 5BBB2006/02/02 0:00:10 6CCC2006/03/02 0:00:10 SELECT DISTINCT ID FROM JOB GROUP BY ID,time HAVING TIME between '2006/01/01 00:00:00' and '2006/02/02 23:59:59' ORDER BY ID というSQL文の実行結果は...    |ID  | ---|----   1|AAA|   2|BBB| <SQL Server 2000> 質問者は、かような結果を期待しているのでしょうか?

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

質問者からのお礼

ありがとうございます。まさにこれです。 原因1 HAVING句のTIMEはGROUP BYのところにもないといけないということですね。 GROUP BY ID →GROUP BY ID,TIMEに書き換えることでエラーが出なくなりました。 原因2 GROUP BY ID,TIMEと書き換えただけの場合、グルーピングはIDとTIMEをひとつの組み合わせとして行われるので、 IDがユニークとしては表示されなくなるので、DISTINCT IDを実施して重複レコードを削除するんですね。 変更後のSQL文 SELECT DISTINCT ID FROM JOB GROUP BY ID,TIME HAVING TIME between '2006/01/01 00:00:00' and '2006/02/02 23:59:59' ORDER BY ID 結果 ID AAA BBB なるほどですね。 ありがとうございました。

関連するQ&A

  • 構文エラー : 演算子がありません。

    アクセスからデータをひっぱってくる、SQL文で、 以下エラーメッセージが発生します。 [Microsoft][ODBC Microsoft Access Driver] クエリ式 'D_time <= & w_jyukobistart' の 構文エラー : 演算子がありません。 ちなみに w_jyukobistart は、画面上で入力された、日付データを含む変数です。この変数をSQLに使っていることが、根本的に違うのでしょうか? '実績テーブル(重複処理する用)へのデータ格納のためのSQLstrSQL6 = "SELECT .sID,B.subject,B.D_time FROM (SELECT sID,Min(D_time) AS mtime ,subject FROM Reg1Data WHERE D_time <= & w_jyukobistart GROUP BY sID,subject) A INNER JOIN Reg1Data B ON A.sID=B.sID AND A.mtime=B.D_time GROUP BY B.sID,B.subject,B.D_time ORDER BY B.sID,B.subject;"

  • select文の表示結果を置き換える

    sql初心者です、皆様ご教授お願いいたします。 以下のようなselect文の結果が・・・ select aaa,bbb,ccc from XXX order by aaa 以下のようになった場合・・・ 埼玉 100 AAA 東京 200 BBB 東京 200 CCC 東京 300 CCC 千葉 400 CCC 以下のような表示を行う事はsqlで可能でしょうか? 埼玉 100 AAA 東京 200 BBB (〃)(〃) CCC (〃) 300 (〃) 千葉 400 (〃) つまり「一つ前のレコードと同じ結果だった項目は”〃”等の任意の文字列を出力する」です。 宜しくお願いいたします。

  • 重複レコードの抽出について

    以下のようなテーブルからmailが重複していてnameの値が全て同じ値を持つレコードを取得するためのSQL文を教えてください。 mail | name ----------- aaa | 01 aaa | 01 aaa | 01 bbb | 02 bbb | 02 bbb | 01 ccc | 01 ccc | 01 ccc | 02 select * from test where mail in (select mail from test where mail group by mail having count(mail)>1) 上記のSQL文だと以下のデータが取得されてしまいます。 ↓ mail | name ----------- aaa | 01 ○ aaa | 01 ○ aaa | 01 ○ bbb | 02 × bbb | 02 × ccc | 01 × ccc | 01 × ○印のみ取得したいのですが、 SQL文をどのように修正すればよいのでしょうか。 よろしくお願いいたします。

その他の回答 (2)

  • 回答No.3
noname#22222
noname#22222

s_husky です。 質問を読み間違っていました。   |ID  |Time | ---|-----------------------  1|AAA|2006/02/01 0:00:10|   2|BBB|2006/02/01 0:00:10| という結果を欲しているならば... Select distinct ID , max(time) as time From job Where Time > '2006/01/01 23:59:59' and Time < '2006/02/01 23:59:59' group by id ※指定された範囲に合致するIDを一意に抜き出し、その間のtimeの最大値を取得する。 ※これで、事実上、同一の結果が求まると思います。

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

  • 回答No.1

どういうエラーになったのでしょうか? GROUP BY指定時、SELECTで選択できるのは、GROUP BYで指定した列か集合関数だけではないでしょうか? 【正】 SELECT C1,COUNT(*) FROM T1 GROUP BY C1 【誤】 SELECT C1,C2,C3 FROM T1 GROUP BY C1 MySQLではSQLの拡張仕様として、上記の書き方も許していますが、他の殆どのRDBMSではエラーになると思います。 >IDをグルーピングしたいと思い 今の指定では、IDでグループ化した場合、TIMEと対応付けられなくなりますよね? >SELECT ID, TIME >FROM JOB >GROUP BY CODE >HAVING TIME between '2006/01/01 00:00:00' >and '2006/01/31 23:59:59' >ORDER BY ID 説明にない列「CODE」でグループ化していますが、「ID」の間違いですか? 「GROUP BY CODE」は、「GROUP BY ID」の間違いと仮定して、SQL例を示します。 【例1】グループ化するIDのみ取り出す SELECT ID FROM JOB GROUP BY ID HAVING TIME between '2006/01/01 00:00:00' and '2006/01/31 23:59:59' ORDER BY ID 【例2】TIMEはIDのグループ毎の最大値を取り出す SELECT ID, MAX(TIME) FROM JOB GROUP BY ID HAVING TIME between '2006/01/01 00:00:00' and '2006/01/31 23:59:59' ORDER BY ID

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

質問者からのお礼

SELECTの理解不足だったようです。WHERE句で簡単にできることに気がつきました。 SELECT ID FROM JOB WHERE TIME between '2006/01/01 00:00:00' and '2006/02/02 23:59:59' GROUP BY ID ORDER BY ID ACCESSだとTIMEを一旦フィールドに入れるのでSQLでも一旦SELECTで選択する必要があると勘違いしていました。 教えていただいたSQL文で気づきました。 ありがとうございました。

質問者からの補足

>>説明にない列「CODE」でグループ化していますが、「ID」の間違いですか? すみません。おっしゃるとおり間違いでした。 エラーですが、「TIME は集合関数やGROUP BY句に含まれないのでHAVINGでは有効とならない」と書いてあります。(#8121) ACCESSの感覚でSQL書いているからだめなんでしょうね。勉強します。 残念ながらいただきましたSQL文でも同様のエラーがでてしまいました。でもアドバイスありがとうございました。

関連するQ&A

  • ACCESSのWHERE文でのAND40個制限

    ACCESS97、VC6、Win2kの環境で、実装していますが、 ACCESSのヘルプで「Access の定義」に WHERE または HAVING 節での AND の数 40 とあります。 発行したいSQL文が SELECT aaa FROM aテーブル WHERE bbb = '1' AND ccc = '2' ... のようにANDが40以上続くものがあり、ACCESSがエラーを発します。 AND が 40 以上あるSELECT文で、ANDを40以上使わずに書く方法を教えていただけませんか?

  • access での BETWEEN

    access2000 のテーブルから、SQL BETWEEN の処理が、うまく行きません・・。 環境 win2k VM 1.4.1_03-b02 テーブルは、  id    具具  1    3  2    9  3    12  4    5  5    8 なカンジです。 コードは、 String betWeen = "SELECT 具具 FROM goo WHERE 具具 BETWEEN 6 AND 13"; ResultSet rs = stm.executeQuery( betWeen ); エラー内容は、 java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 抽出条件でデータ型が一致しません。 です。 SQLは、あってると思うのですが、何か方言的なことなのでしょうか・・? 回答、宜しくお願います・・。

    • ベストアンサー
    • Java
  • SQL Server を使っています。SQLの質問です。

    SQL Server を使っています。SQLの質問です。 得意先テーブルと商品テーブルと売上明細テーブルがあります。 一つの商品に関して得意先ごとに最新の売上明細データの一覧を作成したいと考えて います。 ■売上明細データ 明細ID (meisai_id) 得意先ID (tokuisaki_id) 商品ID  (syohin_id) 売上金額(uriage_kingaku) 売上日 (uriage_date) ■売上明細データ(table_uri_maisai) meisai_id tokuisaki_id syohin_id uriage_kingaku uriage_date =================================================================   1     aaa     001     100     2010/01/01   2     aaa     002     200     2010/01/01   3     bbb     001     105     2010/01/02   4     bbb     002     205     2010/01/02   5     ccc     001     110     2010/01/03   6     ccc     002     210     2010/01/03   7     aaa     001     100     2010/01/04   8     aaa     002     200     2010/01/04   9     bbb     001     105     2010/01/05   10     bbb     002     205     2010/01/05   11     ccc     001     110     2010/01/06   12     ccc     002     210     2010/01/06 上のような明細があり、「syohin_id」が「001」のデータに関して、 得意先ごとの最新のデータだけを抽出したいと考えています。 この場合ですと、以下の3件のデータが抽出できればよいわけです。   7     aaa     001     100     2010/01/04   9     bbb     001     105     2010/01/05   11     ccc     001     110     2010/01/06 tokuisaki_id と syohin_id の2つを特定して1件のデータを抽出するには 以下のSQLで実現できましたが、syohin_id だけを指定して複数のデータを 出すことがどうしてもできません。 SELECT * FROM table_uri_meisai WHERE uriage_date = (select max(uriage_date) FROM table_uri_meisai WHERE tokuisaki_id = 1 AND syohin_id = 1) AND tokuisaki_id = 1 AND syohin_id = 1 どなたかご指導ください。 よろしくお願いします。

  • SQLでご助言いただきたく。

    テーブル名:AAA カラム: 'fname' ,ename テーブル名:BBB カラム: "id",fcode テーブル名:CCC カラム : "id",'fname',date 上記三つのテーブルAAA,BBB,CCCにそれぞれカラムがあります。 最終的に ename fcode date の3カラムを結合した状態でSELECTします。 ただし、条件として AAAのfname列とCCCのfname列を紐付けし、尚且つ BBBのid列とCCCのid列を紐付けし、尚且つ CCCのdate列が2012-10-31以上のものだけをSELECTしたいです。 上記を踏まえて下記二点ご質問致します。 (1)私が考えたSQL文は select a.ename ,bc.fcode ,bc.date from AAA a , (select b.fcode ,c.fname ,c.date from BBB b , CCC c where b.id = c.id and c.date >= '2012-10-31' ) bc where a.fname = bc.fname ; です。先にBBBとCCCから紐付けしその結果とAAAを紐付けしています。 このSQL文で間違いがないかどうか判定していただきたく。 (2)もっとスマートな書き方(短く書けるなど)がありましたら、 ご助言いただきたく。 ちなみにデータベースはオラクル仕様です。 宜しくお願い致します。

  • 複数のテーブルの全てのカラムを一度に検索するには?

    検索対象のカラムがid(主キー)、bc1&#65374;bc40と41個あります。 1つのテーブルに41個のカラムを作り検索させると非常に時間がかかります。 それにインデックスを全部に付けたいですが16個までしかつけられないです。 なので、5つのテーブルにカラムを分けて全部のカラムにインデックスをつけて それぞれを検索させようと思っています。 テーブルが1つだけなら SELECT * FROM `bc` WHERE `bc1`='あいうえおかき' AND `bc2`='あいうえおかき' AND `bc3`='あいうえおかき' AND ・・・ `bc39`='あいうえおかき' AND `bc40`='あいうえおかき' ORDER BY `bc33` DESC LIMIT 0,50; のようにできますが、テーブルが複数の場合はどうしたらよいのでしょうか。 検索を試す前に下記ができるか試してみました。 SELECT COUNT(*) FROM (((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id`) INNER JOIN `eee` ON `ccc`.`id`=`eee`.`id` エラーにはなりませんがカウント数が0になってしまいました。 SELECT COUNT(*) FROM (`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id` これは正確にできてカウント数100000 SELECT COUNT(*) FROM ((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id` 4つ目のテーブルを入れたところから無理なようです。 他に良い方法はないのでしょうか。

    • ベストアンサー
    • MySQL
  • date型でのbetweenについて教えてください。

    皆様、新年明けましておめでとうございます。 早速ですが、date型でのbetweenについて教えてください。 SQL文 SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31' を発行すると、2007-12-31のレコードがあるのに該当しません・・・ 試しにSQL文を SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59' としても2007-12-31のレコードは検索されません・・・ SQL文を SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01' にすると2007-12-31が該当するのですが、 SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31' では2007-12-31のレコードは該当しないものでしょうか?? select * from test where num between 10 and 100 とした場合では、num が 10 ~ 100 のものが問い合わされますよね?? date型になるとこうならないのでしょうか?? よろしくお願いします。

  • SQLPLUSにて演算子を使う方法と条件文を使いたい・・

    以下のようにspoolコマンドにてselectの結果をCSVに出力したいのですが、カンマ区切りしたいため連結していますがエラーが発生します。 spool aaa.csv select AAA || ',' || BBB || ',' ||   CCC - DDD || ',' || EEE from table_A ・・・ そうすると、引き算が引っかかっているらしく、 「ORA-01722:数値が無効です」エラーが発生します。 連結をやめて、「|| ',' ||」→「,」にすれば正常に終了します。 連結の場合に演算子を使うにはどのようにすればよいのでしょうか? また、例えば「AAA<0」の場合には、BBBに100を掛けるとかのような 他カラムでの条件により、別カラムの計算結果を変えるといったことは 可能なのでしょうか? よろしくお願い致します。

  • GROUP BY句の使用方法について(初歩的)

    GROUP BY句の使用方法について質問させて下さい。 ■使用するテーブル  ID   日付 ----------------------  AAA   2007-04-01  AAA   2007-04-01  AAA   2007-04-02  AAA   2007-04-03  BBB   2007-04-01  BBB   2007-04-03  CCC   2007-04-02  CCC   2007-04-02  CCC   2007-04-02 ■抽出したいこと  ID毎のカウントを取りたいのですが、その際に同じ日付は1回のカウントとして抽出したいのです。  即ち、下記の結果を得るのが目的ですが、どのようなクエリとすればいいでしょうか?  ID  cnout(*) ----------------------  AAA   3  BBB   2  CCC   1 初歩的な質問なのですが、宜しくお願い致します。 (※環境はSQL-Server2000です)

  • SQLで件数分SELECT結果を取得するには

    SQLSERVERのSQLで以下の【期待する結果】を取得する方法はありますか? SELECT NAME,COUNT FROM CLASSROOM 【結果】 AAA,2 BBB,1 CCC,3 【期待する結果】 AAA AAA BBB CCC CCC CCC よろしくお願いします。

  • ANDとかORとかを書く位置

    ネットで調べてみても見つからないので皆さんに質問させて下さい。 SQLで結合条件を記述する際、よく仕事現場で見かけるのは以下のような 書き方です。 SELECT うんたら FROM  かんたら WHERE  A = AAA AND   B = BBB OR   C = CCC しかし、個人的にこれは嫌いです。 何故なら結合条件はWHEREの配下に存在するものであり、WHEREと同列 ではないはずだからです。 なので、私が書くとこうなります。 SELECT うんたら FROM  かんたら WHERE  A = AAA AND     B = BBB OR     C = CCC もしくは、そんな書き方しませんが・・・。 SELECT うんたら FROM  かんたら WHERE  A = AAA     AND     B = BBB     OR     C = CCC ここで、最初に示した書き方に最もな理由が知りたいと思います。 好みの問題なのかもしれませんが・・・。 投稿時のインデントが上手くいかないのでいいように解釈して下さい(笑)