2016-08-06 7 views
0

1つの列のすべての値を数えてから、この数に別のテーブルの値を掛けようとしています。これまでのところ、私は持っています:異なるテーブルの列の値の合計値を掛け合わせます

SELECT CLUB_FEE * COUNT(MEMBER_ID) AS VALUE 
FROM CLUB, SUBSCRIPTION 
WHERE CLUB_ID = 'CLUB1'; 

これはうまくいきません、誰でも助けてくれますか?

私はまた、複数のクラブでこれを行うのを助ける必要があります。それはすべてのクラブのために1つの声明の中ですべてそれをすることが可能ですか?

+0

サンプルデータと予想される出力を追加してください –

+0

あなたの質問を編集し、サンプルデータと希望する結果を提供してください。 –

+0

[古いスタイルのJOINを使用した習慣が悪い](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - ANSI - ** 92 ** SQL標準(* ** 20年以上前**)のold * style *カンマ区切りのテーブル*スタイルのリストが*適切な* ANSI 'JOIN'構文に置き換えられましたその使用はお勧めしません –

答えて

1

おそらく、あなたはこのような何かを意図する:

SELECT MAX(c.CLUB_FEE) * COUNT(MEMBER_ID) AS VALUE 
FROM CLUB c JOIN 
    SUBSCRIPTION s 
    ON c.CLUB_ID = s.CLUB_ID 
WHERE c.CLUB_ID = 'CLUB1'; 

としてあなたもこれを書くことができます:私はOPが質問にCOUNT()を指定しますので、最初のバージョンは、より明確になるだろうと思った

SELECT SUM(c.CLUB_FEE) AS VALUE 
FROM CLUB c JOIN 
    SUBSCRIPTION s 
    ON c.CLUB_ID = s.CLUB_ID 
WHERE c.CLUB_ID = 'CLUB1'; 

あなたが加入者を持つすべてのクラブのためにそれをしたい場合:

SELECT SUM(c.CLUB_FEE) AS VALUE 
FROM CLUB c JOIN 
    SUBSCRIPTION s 
    ON c.CLUB_ID = s.CLUB_ID 
GROUP BY c.CLUB_ID; 
+0

CLUB_FEEのMAXはなぜですか? CLUB_IDごとに1つのCLUB_FEEが必要です(そうでなければ、差別化された料金がある場合、VALUEは単純に会員数に最大料金を乗算した数ではありません)。 – mathguy

+0

@mathguy。 。 。それ以外の場合は、 'group by'が必要です。 –

+0

ええ、私はそれを実現しました。ユニークなclub_feeの選択がクラブのテーブルにプッシュされるかどうか、それを考えて...説明計画を立てて遊ぶ。 – mathguy

0

計画を説明し、検査から、参加を回避し、唯一の集約を使用しているため、次のバージョンは、もう少し(効率的かもしれらしいです)。これをすべてのクラブに同時に必要とする場合は、おそらくすべてのソリューションが同じ「オプティマイザ・コスト」を持つことになります(ある時点ですべて参加します)。

select club_fee * (select count(member_id) from subscription where club_id = 'CLUB1') 
from club 
where club_id = 'CLUB1' 

は、だから今だけの集計関数は、サブクエリ内に押し込まれ、残りはいずれかの加入または別の集計関数は必要ありません。

もちろん、パフォーマンスが重要な場合にのみ重要です。それは非常によくないかもしれません。

関連する問題