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
正しい記述を教えていただけますでしょうか。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
例えば、次のような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
なるほどですね。
ありがとうございました。
No.3
- 回答日時:
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
この回答への補足
>>説明にない列「CODE」でグループ化していますが、「ID」の間違いですか?
すみません。おっしゃるとおり間違いでした。
エラーですが、「TIME は集合関数やGROUP BY句に含まれないのでHAVINGでは有効とならない」と書いてあります。(#8121)
ACCESSの感覚でSQL書いているからだめなんでしょうね。勉強します。
残念ながらいただきましたSQL文でも同様のエラーがでてしまいました。でもアドバイスありがとうございました。
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文で気づきました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
PL/SQLのコンパイルエラーにつ...
-
データーベースリンク
-
「ORA-00907: 右カッコがありま...
-
オラクル致命的なエラー(provi...
-
データベースのカラムの型がCHA...
-
ORA-01843: 指定した月が無効で...
-
PRO*COBOLのSQLCTXの桁数変更
-
ORA-06502のエラー
-
はじめまして!
-
dmpファイルのインポート時にで...
-
正規表現を使用したCHECK制約
-
ora-01033 oracle intializatio...
-
ORA-14459: GLOBALキーワードが...
-
SQLLOADER
-
外部ライブラリのロード中にエ...
-
PCC-S-02201エラーの対処を教え...
-
トリガーのエラー
-
PL-SQLでORA-01013エラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ORA-01013のエラーについて経験...
-
CASE文のエラーについて
-
PL/SQLのコンパイルエラーにつ...
-
PL/SQL PLS-00103エラーについて
-
ORA-06502のエラー
-
シェルスクリプトでオラクルの...
-
PCC-S-02201エラーの対処を教え...
-
はじめまして!
-
ORA-01843: 指定した月が無効で...
-
SQLLOADER
-
PL/SQLによるCREATE TABLE後のI...
-
「ORA-00907: 右カッコがありま...
-
DATABSE LINKについて
-
無効なSQL文の具体例を教えてく...
-
【PL/SQL】SQL文が長すぎてSELE...
-
ストアドファンクションの実行
-
データベースのカラムの型がCHA...
-
sqlのエラーハンドリングについ...
-
HAVING句でのBETWEEN演算子
-
ACCESSでパススルークエリにパ...
おすすめ情報