我正在尝试计算一列中的所有值,然后将此数字乘以另一个表中的值。到目前为止,我有:
SELECT CLUB_FEE * COUNT(MEMBER_ID) AS VALUE
FROM CLUB, SUBSCRIPTION
WHERE CLUB_ID = 'CLUB1';
这不起作用,有人可以帮忙吗?
我还需要为多个俱乐部提供帮助。是否可以在所有俱乐部的一个声明中完成所有操作,然后获得平均值?
答案 0 :(得分: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;
答案 1 :(得分:0)
通过检查解释计划,似乎以下版本可能更有效(因为它避免了连接并且仅使用一个聚合)。如果你同时为所有俱乐部都需要这个,那么可能所有的解决方案都会有相同的“优化成本”(他们都会在某个时候加入)。
select club_fee * (select count(member_id) from subscription where club_id = 'CLUB1')
from club
where club_id = 'CLUB1'
所以现在唯一的聚合函数被推入子查询,其余的不需要连接或其他聚合函数。
当然,这只有表现才重要;它很可能不会。