- PR -

SQL Server 2000 GROUP BY についてお聞きしたいですが。

1
投稿者投稿内容
comeseesee
常連さん
会議室デビュー日: 2004/11/24
投稿数: 36
投稿日時: 2004-11-25 09:41
SQL Server 2000 GROUP BY についてお聞きしたいですが。
いつもお世話になっております。
今回はGROUP BYについてお聞きしたいですが、
以下のようなデータが存在するとき
@サブクエリを使わずに ある列をMAX()で取得する行の全てのカラムを取り出したい

以下の様な表で、

コード カラムA カラムB カラムC
01 10 20 30
01 40 50 60
01 70 80 90 →コード01のこの行の全てのカラムを取り出す

02 100 110 120
02 130 140 150 →コード02のこの行の全てのカラムを取り出す

03 ・・・・・・
03 ・・・・・・
03   ・・・・・・

以下のSQL文で試してみましたが、コードでGROUP BYしていないみたいです(コード 01)の全ての行を取得してしまった。

SELECT
コード,
カラムA,
MAX(カラムB),
カラムC
FROM [表]
WHERE [カラムB] < @パラメータ
GROUP BY [コード]
コード,
カラムA,
カラムC

ひとつのSQL文で、MAX()で取得した行の全てのカラムを取得する方法を教えて頂きたいですが

よろしくおねがいいたします

[ メッセージ編集済み 編集者: comeseesee 編集日時 2004-11-25 09:59 ]
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2004-11-25 10:50
サブクエリもしくはTransact SQLを使わなくてはできないのではないでしょうか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-25 21:42
 対コンピュータの時は何でもそうなのですが、コンピュータの言語(使いたい言語)の処理区分まで、やりたいことをブレークダウンして考えましょう。また、使いたい関数、式が、何をするものなのか、理解しましょう。

 GROUP BY句は集計用の句なので、SELECT結果は必ずグループされるか、集計用関数が必要です。その辺でエラーが出たために、
引用:
コード:
SELECT
  コード,
  カラムA,
  MAX(カラムB),
  カラムC
FROM [表]
WHERE [カラムB] < @パラメータ
GROUP BY [コード]
  コード,
  カラムA,
  カラムC



としているのだと思います(エラーが出るような気もするが)。これでは「コード、カラムA、カラムC」でグループを作り、作ったグループからカラムBの最大値を取るという操作になるので、『コードでGROUP BYしていないみたいです』という結果、つまり、全行取得になります。グループ化していないのではなく、グループ化されていないように見えるグループ化をしているのです。

 別所で同じような質問を目にしたことがありますが、その時は「1回の問い合わせで」だったと思います。その時の回答から、1回の問い合わせかつサブクエリを使わない、というのは無理なように思います。なぜ、サブクエリを使わないで、なのでしょう?
コード:
SELECT コード, カラムA, カラムB, カラムC
FROM 表 RIGHT JOIN (SELECT コード, MAX(カラムB) AS カラムB
  FROM 表
  GROUP BY コード) 表2
    ON 表.コード = 表2.コード AND 表.カラムB = 表2.カラムB




注:「GROUP BY句は集計用の句」
 Books Onlineの、キーワードで「GROUP BY」を指定し、サブエントリの「行のグループ化」を選択する。「GROUP BY による行のグループ化」というドキュメントにある、次の意味。
引用:

GROUP BY 句は、結果セット内の行ごとに集計値を生成するために使用します。

comeseesee
常連さん
会議室デビュー日: 2004/11/24
投稿数: 36
投稿日時: 2004-11-26 10:15
教えて頂いた通りSQL文を書いてみました。OKでした。
アドバイス、ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-26 21:40
 本当にOkでしたか?例えば、こんなデータは、どうなります?
コード:
コード カラムA カラムB カラムC
    01      10      20      30
    01      40      50      60
    01      70      80      90
    01      60      80     100


 また、最初のご質問にあった『サブクエリを使わず』を満足していませんよ?
comeseesee
常連さん
会議室デビュー日: 2004/11/24
投稿数: 36
投稿日時: 2004-11-29 14:08
今回の検索はカラムAとカラムCを考えなくてもいいです。Jitta様ご指摘のような場合はコードの「001」とカラムBの「80」を取得すればOKですが、ちょっと気になりますね。

コード カラムA カラムB カラムC
01 10 20 30
01 40 50 60
01 70 80 90
01 60 80 100

1

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