2016-08-06 31 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' 

所以,现在唯一的聚集函数推入子查询,其余并不需要或者加入或其他聚合函数。

当然,这只在性能很重要时才重要;它可能不是。