2016-08-06 34 views
0

我試圖計算一列中的所有值,然後將此數乘以不同表中的值。到目前爲止,我有:在不同的表中乘以列中值的總數

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

這不工作,但任何人都可以請幫忙嗎?

我也需要幫助爲多個俱樂部做這個。是否可以在所有俱樂部的一個聲明中完成這一切,然後獲得平均水平?

+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年前的**)中,舊式*逗號分隔的表*樣式列表被替換爲* proper * 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'; 

你也可以寫爲:

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'; 

我認爲第一個版本會更清晰,因爲OP指定COUNT()的問題。

如果你想爲有用戶所有的俱樂部:

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

爲什麼MAX在CLUB_FEE上?每個CLUB_ID應該只有一個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' 

所以,現在唯一的聚集函數推入子查詢,其餘並不需要或者加入或其他聚合函數。

當然,這隻在性能很重要時才重要;它可能不是。