2016-10-13 8 views
0

私はこのoracleのすべての列でgroup byを使用せずにagregate関数を使用する方法は?

select s1.sum(price),s1.brand,s2.comment 
from X s1, X s2 
where s1.date2='131016' 
    and s1.brand=s2.brand 
    and s2.date1=(select max(date1) from X where date2='131016') 
group by s1.brand; 
のようなクエリに何かをしようとしていたdate2の131016.

sum(price) *brand *Comment 
    ************************** 
    300  *a  *i 
    400  *b  *k 

のために合計(価格)、ブランド、maxのコメント(DATE1)をしたい、このテーブルX

Date1 *Date2 *Price * Brand*Comment 
    **************************************** 
    111016 *131016 *100 *a  *h 
    121016 *131016 *200 *a  *i 
    111016 *131016 *300 *b  *j 
    121016 *131016 *100 *b  *k 

を持っています

ここで私のアプローチが間違っているようです。 上記の方法でデータを表示するためにselectクエリを使用するにはどうすればよいですか?テーブルには合計額を表示する必要がある価格と同様の列が20以上あることを心に留めておいてください。

+1

どの「コメント」値を表示するかはどのように決定しますか?おそらくあなたは 's2.comment'ではなく' max(s2.comment) 'を望んでいるでしょう。しかし、それはあなたが実際にしているものかもしれないし、そうでないかもしれません(少なくとも20個の別々の列の 'max 'を取ることで、たくさんの異なる行からデータを引っ張ってくることは少なくとも疑わしいでしょう)。 –

+0

@ JustinCaveのポイントに。あなたの出力に 'i'と' k'をコメントしたいとどのように決めましたか? 'h'や' j'をコメントしてみませんか?それとも、気にしないで、ブランドごとにランダムなコメントを返すだけですか? – JNevill

+0

'date1'と' date2'のデータ型は何ですか? "日付"の代わりに数値または文字列である場合、比較(MAXなど)は間違った答えを与えます。日付データ型にする日付が必要です。そうでない場合は、文字列の周りに 'to_date()'を使います(文字列の場合)。 – mathguy

答えて

0

ここでは、以下のような(COL1)OVER(COL2 BY PARTITION、...、COL2 BYコルンのORDER、...、コルン)分析関数にSUMを使用することができます。

select sum(s1.price) over(partition by s1.brand), 
     s1.brand, 
     s2.comment 
    from X s1, X s2 
where s1.date2 = ‘131016’ 
    and s1.brand = s2.brand 
    and s2.date1 = (select max(date1) from X where date2 = s1.date2); 

我々はデータを集約しながら、GROUP BYが必要です。しかし、GROUP BYは、PARTITION BY(これはGROUP BYのアナログです)を使用することで回避できます。

チェックアウト分析関数をよりよく理解するために、このリンク.. https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions182.htm#SQLRF06115

0

Oracleのセットアップ

CREATE TABLE X (Date1, Date2, Price, Brand, "Comment") AS 
SELECT DATE '2016-10-11', DATE '2016-10-13', 100, 'a', 'h' FROM DUAL UNION ALL 
SELECT DATE '2016-10-12', DATE '2016-10-13', 200, 'a', 'i' FROM DUAL UNION ALL 
SELECT DATE '2016-10-11', DATE '2016-10-13', 300, 'b', 'j' FROM DUAL UNION ALL 
SELECT DATE '2016-10-12', DATE '2016-10-13', 100, 'b', 'k' FROM DUAL; 

Oracleのクエリ

SELECT SUM(price) AS total_price, 
     brand, 
     MAX("Comment") KEEP (DENSE_RANK LAST ORDER BY date1) AS "Comment" 
FROM X 
WHERE Date2 = DATE '2016-10-13' 
GROUP BY brand; 

出力

TOTAL_PRICE BRAND Comment 
----------- ----- ------- 
     300 a  i  
     400 b  k  
+0

メモ... 'comment'は予約語です。私は' comm'や 'comment1'などを使用します。 'sum(price) 'は実物のデータに期待している奇妙な集計のように見えますが、" price "(異なる日付の同じアイテムの場合)ではなく、総売上金額を加算しています。どこかにWHERE句もありました。 – mathguy

+0

@mathguy OPが使用していたカラム名を使用しました。 – MT0

+0

@mathguyこれは単なる表であり、私の問題を説明するために執筆の瞬間に作ったものです。私はちょうど私の心の中に入った列の名前を書きました。私が取り組んでいる実際の問題は似ていません。少しでも。 – sanyamjain

関連する問題