- PR -

SQL : Groupしたい

1
投稿者投稿内容
さわこ
ベテラン
会議室デビュー日: 2003/06/04
投稿数: 71
投稿日時: 2003-07-23 14:28
[Table名:TEST]

PROJECT_ID OPE_RESULT OPE_RANK OPE_NUMBER ITEM_ROW ITEM_COL
-----------------------------------------------------------------------
      01               C        1          01      01
      01     NG        B        2          01      01
      01     OK                  3          01      01
      01               C        3          03      02

KEY項目:PROJECT_ID,OPE_NUMBER,ITEM_ROW,ITEM_COL

条件
@PROJECT_IDが同じ
AITEM_ROW項目とITEM_COL項目が同じならば、1つにまとめ(OPE_NUMBERのMAXでまとめる)表示する

結果一覧
PROJECT_ID OPE_RESULT OPE_RANK OPE_NUMBER ITEM_ROW ITEM_COL
-----------------------------------------------------------------------
      01     OK                  3          01      01
      01               C        3          03      02
となっていたいのです。

がっ。
SELECT PROJECT_ID, OPE_RESULT, OPE_RANK, MAX(OPE_NUMBER) AS OPE_NUMBER,
ITEM_ROW, ITEM_COL
FROM TMD102
WHERE (PROJECT_ID = '01')
GROUP BY PROJECT_ID, OPE_RESULT, OPE_RANK, ITEM_ROW, ITEM_COL
ORDER BY ITEM_ROW, ITEM_COL

と書いてもGROUPになってくれるわけでもなく・・・
普通に最初に書いたデータ通りに出てきてしまいます。

なにがおかしいのでしょうか?
どうか教えてください!!
よろしくお願いいたします。
なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-23 15:35
> GROUP BY PROJECT_ID, OPE_RESULT, OPE_RANK, ITEM_ROW, ITEM_COL

ITEM_ROWとITEM_COLでまとめたいならば、
GROUP BY ITEM_ROW, ITEM_COL
(や、副問合せとDISTINCT)
になります。
他の列が必要ならば、副問合せにして、PRIMARY KEYで連結して...と、それなりに手間がかかります。

・PRIMARY KEYの列名は?
・データベース製品とバージョンは何でしょうか?
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2003-07-23 15:46
この手の質問はこちらのサイトがいいかと思います。

RDB研究館
http://www.mars.dti.ne.jp/~o-shin/
さわこ
ベテラン
会議室デビュー日: 2003/06/04
投稿数: 71
投稿日時: 2003-07-23 15:49
皆様お返事ありがとうございます。

なな様

・PRIMARY KEYの列名は PROJECT_IDとITEM_ROWとITEM_COLとOPE_NUMBER です
・DBは SQLserver2000 です

よろしくお願いいたします
なな
ぬし
会議室デビュー日: 2003/06/22
投稿数: 659
お住まい・勤務地: 愛知県
投稿日時: 2003-07-23 18:09
こんな感じでしょうか?


SELECT
BASE.PROJECT_ID PROJECT_ID,
ADD.OPE_RESULT OPE_RESULT,
ADD.OPE_RANK OPE_RANK,
BASE.ITEM_ROW ITEM_ROW,
BASE.ITEM_COL ITEM_COL,
BASE.OPE_NUMBER OPE_NUMBER
FROM
(
SELECT
PROJECT_ID,
ITEM_ROW,
ITEM_COL,
MAX(OPE_NUMBER) AS OPE_NUMBER,
FROM
TMD102
GROUP BY
PROJECT_ID,
ITEM_ROW,
ITEM_COL
) BASE,
TMD102 ADD
WHERE
BASE.PROJECT_ID = ADD.PROJECT_ID
AND
BASE.ITEM_ROW = ADD.ITEM_ROW
AND
BASE.ITEM_COL = ADD.ITEM_COL
AND
BASE.OPE_NUMBER = ADD.OPE_NUMBER
ORDER BY
ITEM_ROW,
ITEM_COL


# たしかに、この会議室は不適切かも?
# SQL Server使ったこと無いので...もっと便利機能があるかも?
リックス
常連さん
会議室デビュー日: 2001/10/01
投稿数: 47
お住まい・勤務地: 東京
投稿日時: 2003-07-23 20:05
こんばんは。

ななさんと同様のクエリーになりました。
ななさんが示されたクエリーには、ADDなどSQLServer2000の予約語が入っていて、そのままでは動かないので、私もクエリーを例示します。

コード:
SELECT A.PROJECT_ID,A.OPE_RESULT ,A.OPE_RANK , A.OPE_NUMBER , A.ITEM_ROW , A.ITEM_COL
FROM TEST AS A 
INNER JOIN ( SELECT 
             PROJECT_ID, ITEM_ROW, ITEM_COL, MAX(OPE_NUMBER) AS OPE_NUMBER
             FROM TEST 
             GROUP BY PROJECT_ID, ITEM_ROW, ITEM_COL 
           ) AS B
ON A.PROJECT_ID = B.PROJECT_ID 
AND A.ITEM_ROW = B.ITEM_ROW 
AND A.ITEM_COL = B.ITEM_COL 
AND A.OPE_NUMBER = B.OPE_NUMBER 
ORDER BY A.PROJECT_ID, A.ITEM_ROW, A.ITEM_COL


集合間の結合になりますので、INNER JOIN 句を使用しました。
INNER JOINは、ななさんが書かれたWHERE句での結合と同義です。

> # たしかに、この会議室は不適切かも?
@ITでは、データベースってどこに属するのか微妙ですね。
時々、ネットワークのところに記事が上がりますが、ちょっと違和感があります。
1

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