2016-11-27 18 views
0

以下のクエリは合計金額によって並べ替え最も人気のある劇場や行型の組み合わせのリストを返します。 ので、例えば:ORACLE - MAXとSUM

NAME  ROWTYPE TOTALAMOUNT 
theatre1 middle 200 
theatre2 front 190 
theatre1 front 150 
theatre2 middle 100 

私は必要なもののに対し、単に劇場あたりの最大です。

theatre1 middle 200 
theatre2 front 190 

問合せ:

SELECT name, rowtype, sum 
from (select 
name, rowtype, sum(totalamount) sum from trow, fact, theatre 

Where trow.trowid = fact.trowid 
AND 
theatre.theatreid = fact.theatreid 

GROUP BY rowtype, name 
) 

ORDER BY sum DESC, name, rowtype ; 
+0

合計(totalamount)を使用する目的、事実および劇場テーブルの定義を共有してください –

+0

NAMEフィールドとROWTYPEフィールドがどのテーブルから来たのかわかっていると便利です。私はNAMEが劇場の名前で、THEATERから来ていて、行のタイプはTROWから来ていると思っていますが、TOTALAMOUNTがどこから来たのかという疑問が残っています。この質問のいくつかの明確化は有用であろう。ありがとう。 –

答えて

0

あなたは、このためのウィンドウ関数を使用することができます。

select name, rowtype, sum 
from (select name, rowtype, sum(totalamount) as sumta, 
      max(sum(totalamount)) over (partition by name) as maxsumta 
     from trow join 
      fact 
      on trow.trowid = fact.trowid join 
      theatre 
      on theatre.theatreid = fact.theatreid 
    group byrowtype, name 
    ) nr 
where sumta = maxsumta; 

また、あなたは正しい、明示的なJOIN構文を使用することを学ぶ必要があります。単純なルール:は、FROM句のカンマを使用します。 常には、適切な明示的なJOIN構文を使用します。

+0

こんにちはありがとうございますこれはうまく動作します –

0

あなたの現在のクエリを入れて共通のテーブル式に変換し、ウィンドウ機能を使用して各劇場の最大合計金額を検索します。

WITH cte AS 
(
    SELECT name, rowtype, SUM(totalamount) sum 
    FROM trow 
    INNER JOIN fact 
     ON trow.trowid = fact.trowid 
    INNER JOIN theatre 
     ON theatre.theatreid = fact.theatreid 
    GROUP BY name, rowtype 
) 

SELECT name, rowtype, sum 
FROM 
(
    SELECT name, 
      rowtype, 
      sum, 
      MAX(sum) OVER (PARTITION BY name) maxSum 
    FROM cte 
) t 
WHERE t.sum = t.maxSum 
+0

こんにちは、ご意見ありがとうございます - オラクルは以下のエラーを返していますORA-00979:GROUP BYの式ではありません –

+0

@HannahFarrugiaもう一度クエリを試すことができますか? –