- PR -

グループ化の仕方がわかりません

投稿者投稿内容
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2005-11-01 16:10
SELECT DOC_NO FROM AAA WHERE CD='1' AND ID='90009999' AND KNS_CODE IN ('000000', '111111', '222222') ORDER BY CD, YMD, KNS_CODE ASC
というSQLを流すと

DOC_NO
--------------------
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
BBBBBBBBBB
BBBBBBBBBB
BBBBBBBBBB
CCCCCCCCCC
DDDDDDDDDD
DDDDDDDDDD
DDDDDDDDDD
DDDDDDDDDD
DDDDDDDDDD

というデータが取得できます。
DOC_NOを一件ずつ取得したい場合GROUP BY DOC_NOだと思うのですが、
エラーばかりでどうしてもうまくいきません・。
どなたかお詳しい方教えてください!!
SIVA
会議室デビュー日: 2005/05/25
投稿数: 9
投稿日時: 2005-11-01 16:21
こんにちは。

試しに
SELECT DOC_NO FROM AAA WHERE CD='1' AND ID='90009999' AND KNS_CODE IN ('000000', '111111', '222222') GROUP BY DOC_NO

は上手く行きますでしょうか?

AAAAAAAAAA
BBBBBBBBBB
CCCCCCCCCC
DDDDDDDDDD

になれば良いと言うことですよね?
(今回はORDER BY が無いので順不同になりますけど...)


[ メッセージ編集済み 編集者: SIVA 編集日時 2005-11-01 16:23 ]
たまき
会議室デビュー日: 2005/02/17
投稿数: 10
投稿日時: 2005-11-01 16:22
こんにちは。

DOC_NOを一件ずつ取得したいというのは、重複データは取得しないという意味でしょうか?
もしそれでしたら「DISTINCT」が有効だと思います。

<追記>
すみません、グループ化のやり方のご質問でしたね;
どんな風に書かれているのかわかりませんが、GROUPBYはORDERBYより先に入れるようにしてみてください。m(__)m

_________________
たまき@天
凶暴な兎ほど可愛い!?

[ メッセージ編集済み 編集者: たまき 編集日時 2005-11-01 16:41 ]

[ メッセージ編集済み 編集者: たまき 編集日時 2005-11-01 16:44 ]
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2005-11-01 16:42
SIVAさん、たまきさん
返答ありがとうございます。

質問が悪くてすみませんでした。
AAAAAAAAAA
BBBBBBBBBB
CCCCCCCCCC
DDDDDDDDDD
というデータが取得できれば」成功なのですが。。。

>試しに
>SELECT DOC_NO FROM AAA WHERE CD='1' AND ID='90009999' AND KNS_CODE IN <('000000', '111111', '222222') GROUP BY DOC_NO
>
>は上手く行きますでしょうか?
できましたが、YMDなどの順序は必要なのでORDERBYは省くことができません(><)

>DOC_NOを一件ずつ取得したいというのは、重複データは取得しないという意味でしょうか?
>もしそれでしたら「DISTINCT」が有効だと思います。
「ORDER BY句 (CD)がDISTINCT句と矛盾しています」というエラーメッセージがでてしまします。


今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-11-01 16:52
引用:

わしこさんの書き込み (2005-11-01 16:10) より:
SELECT DOC_NO FROM AAA WHERE CD='1' AND ID='90009999' AND KNS_CODE IN ('000000', '111111', '222222') ORDER BY CD, YMD, KNS_CODE ASC
というSQLを流すと

DOC_NO
--------------------
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
AAAAAAAAAA
BBBBBBBBBB
BBBBBBBBBB
BBBBBBBBBB
CCCCCCCCCC
DDDDDDDDDD
DDDDDDDDDD
DDDDDDDDDD
DDDDDDDDDD
DDDDDDDDDD

というデータが取得できます。
DOC_NOを一件ずつ取得したい場合GROUP BY DOC_NOだと思うのですが、
エラーばかりでどうしてもうまくいきません・。
どなたかお詳しい方教えてください!!


エラー内容も、DBの種類も書かれていませんが、
グループ化した項目を表示して、
表示しない項目でソートをしたいんですか?

Oracleとかですと、ORDER BYの説明文に以下のような内容が書かれています。
引用:

同じ文中でgroup_by_clause を指定する場合、このorder_by_clause は次の式に
制限されます。
 定数
 集計ファンクション
 分析ファンクション
 USER ファンクション、UID ファンクションおよびSYSDATE ファンクション
 group_by_clause に指定されているものと同じ式
 グループ内のすべての行が同じ値に評価されるこれらの式を導出する式


ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-11-01 17:02
ちょっと列が多いので少なくして例をあげると。
わしこさんがDBMSだったとして、こんなデータに対して

コード:

DOC_NO     CD
-------------------- 
AAAAAAAAAA 0001
AAAAAAAAAA 0002
AAAAAAAAAA 1000
AAAAAAAAAA 0004
AAAAAAAAAA 9999
BBBBBBBBBB 0001
BBBBBBBBBB 1000
BBBBBBBBBB 0003
CCCCCCCCCC 3001
DDDDDDDDDD 9002
DDDDDDDDDD 0001



「DOC_NOでグループ化しつつCDでソートしてくれ」
と言われたら困りませんか?「どのCD使うんだよ」ってなりますよね。
エラーメッセ−ジは、多分そんな感じのことを言われてるんだと思います。

だから上記の例の場合は、

SELECT DOC_NO, MAX(CD) AS MAX_CD FROM AAA
GROUP BY DOC_NO
ORDER BY MAX_CD

みたいにすればいいのだと思います。

余談ですが、SQLに関する質問なら、Database Expert 会議室の方がいいかもです。
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2005-11-01 17:25
ぼのぼのさん、夏椰さん返信ありがとうございます。

DBはORACLEです。

>「DOC_NOでグループ化しつつCDでソートしてくれ」
>と言われたら困りませんか?「どのCD使うんだよ」ってなりますよね。
>エラーメッセ−ジは、多分そんな感じのことを言われてるんだと思います。
すごく解りやすいご説明ありがとうございます。
何故エラーになるのか解りました。

>だから上記の例の場合は、
>SELECT DOC_NO, MAX(CD) AS MAX_CD FROM AAA
>GROUP BY DOC_NO
>ORDER BY MAX_CD
>みたいにすればいいのだと思います。
もしデータが以下のようになってもできますでしょうか?
ACCESSで試してみたところYMDの入力が要求されました。

DOC_NO YMD(※CDからYMDに変更しました)
--------------------
AAAAAAAAAA 2222
AAAAAAAAAA 2222
AAAAAAAAAA 1000
AAAAAAAAAA 1000
AAAAAAAAAA 2222
BBBBBBBBBB 0000
BBBBBBBBBB 0000
BBBBBBBBBB 0000
CCCCCCCCCC 8888
DDDDDDDDDD 2222
DDDDDDDDDD 2222
[/code]

当初は
ORDER BY CD, YMD, KNS_CODE ASC
と書いていましたが、CD、KNS_CODEは同じ値なのでソートしないとして、
YMDだけは必ずソートしなくてはいけないのですが、
同じ日付が入ってくる場合がかなりあるのです。

どうかよろしくお願いします。
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-11-01 17:47
こんにちは、でっちです。

ちょっと抽出します。
コード:
DOC_NO     YMD
---------- --------- 
AAAAAAAAAA 2222 
AAAAAAAAAA 2222 
AAAAAAAAAA 1000 
AAAAAAAAAA 1000 
AAAAAAAAAA 2222 



この部分ですが、同一のDOC_NOに対してYMDが2種類あります。
グループ化の結果取得したいデータは、1件、2件のどちらになるのでしょうか?
1件であれば、先にぼのぼのさんが書かれたように、MINやMAX等のグループ関数を使用することになります。(複数YMDのうち何でソートするかは仕様なので、適切なものをご選択下さい)
※エラーになったのは、おそらく別名の付け方を誤っているのではないでしょうか?
 試されたSQLを載せていただければ判断ができるかと思います。

2件であれば、GROPU BYする項目にYMDも追加してあげれば良いだけです。

スキルアップ/キャリアアップ(JOB@IT)