2016-05-27 14 views
0

は、私はこのようなデータセットを持って言う:Oracleの1つのフィールドでグループ化する方法は?

MANAGER | USER | NUM1 | NUM2 | NUM3 
---------|--------|--------|--------|------- 
Bob  | Jane | 9  | 88 | 2 
Bob  | Jane | 34 | 32 | 52 
Bob  | Jane | 32 | 111 | 9 
Bob  | Rick | 64 | 1  | 102 
Bob  | Rick | 12 | 41 | 16 
Bob  | Rick | 4  | 13 | 20 
Bob  | Mark | 87 | 1  | 333 
Bob  | Mark | 342 | 41 | 16 
Bob  | Mark | 54 | 813 | 6 

あなたは数の列がすべて異なっている見ることができるように、管理者は常に同じであり、ユーザが繰り返しています。

ユーザーごとに1つの列のみが表示されるようにユーザー別にグループ化したいと考えています。

ので、最終的なデータセットは、次のようになります。あなたがグループに必要なので、このコードは、すべての集計では動作しません

SELECT MANAGER, USER, NUM1, NUM2, SUM(NUM3) AS NUM3 
FROM MYTABLE 
GROUP BY USER 

MANAGER | USER | NUM1 | NUM2 | NUM3 
---------|--------|--------|--------|------- 
Bob  | Jane | 9  | 88 | 2 
Bob  | Rick | 64 | 1  | 102 
Bob  | Mark | 87 | 1  | 333 

を、私はこのような何かを実行したいのですが機能。 NUM1とNUM2の値が変更されるため、他の列で集計関数を使用する必要はありません。これを回避する方法はありますか?誰でも私がこれを実現させるために何ができるのか知っていますか?

+1

説明とサンプルデータが一致しません。 –

+1

なぜ 'sum(num3)'ですか?最終データセットには元のデータから1行だけが集計されていますが、これはあなたの言った内容と一致しません。 「1列あたりのユーザー数」は「1行...」となっていましたか? 1つの行が必要な場合、どの行をどのように決定しますか? –

+0

GordonLinoff、これは単なるランダムな例でした。 @アレックスプール、あなたは正しいです、どのように保つべきものが決定されたのですか?他の人がやったデータセットを再現しようとしていますが、異なるフィールドを持つ別のテーブルがあります。だから、このテーブルで私はこれらの望ましくない結果を得ています。しかし私はグループ分けをすることができるSSRSに私の質問を入れました、そして、ちょうど最初の行を選んだだけです。それは正しいものではありません。だから何をすべきか分からない。 – Zolt

答えて

2

列NUM3以上の合計を取得する必要がある場合は、考えられる解決策です。 SUMの解析バージョン(ウィンドウ関数)を使用します。それは、ROW_NUMBERと並んでいます。そうでない場合、Oracleは、任意の順序を選ぶことが、

SELECT MANAGER, USER, NUM1, NUM2, NUM3 
FROM 
    (SELECT 
     MANAGER, USER, NUM1, NUM2, 
     ROW_NUMBER() over (partition by MANAGER, USER /* order by ....*/) AS USERROWNUMBER, 
     SUM(NUM3) over (partition by MANAGER, USER) AS NUM3 
    FROM MYTABLE) 
WHERE 
    USERROWNUMBER = 1 

それはROW_NUMBERウィンドウ関数のorder by句を指定するにはすてきなことで希望:これは、あなたが最初の行がグループごとに何であるかを定義し、まだグループの総和を選択することができます別の機会に異なる順序で行を返すことさえできます。 IDまたはNUM1などでソートすると、より一貫した結果を得ることができます。

NUM3を合計する必要がない場合は、NUM1とNUM2のように選択して、SUM式全体をそのまま残すことができます。

関連する問題