我试图从同一个表中获取两个不同列的总和,按用户分组。问题是,我必须找到的一个总和,需要一些额外的参数。
表1:
userid, fname, lname
表2:
assigned_to (is = to userid from other table),
est_hours (est = Estimate hours),
act_hours (act = Actual Hours),
completed_date
我只希望来自已标记为已完成的条目的est_hours(通过在completed_date列中包含值。如果completed_date为空,则act_hours将为空白)
我的查询问题是我没有得到act_hours和est_hours之和的正确值。我认为这与嵌套查询不匹配正确的用户ID有关。 查询:
SELECT userid,
fname,
lname,
SUM(act_hours)+(SELECT SUM(est_hours)
from Table2
WHERE completed_date IS NULL) AS total_hours
FROM TABLE2,
TABLE1
WHERE TABLE1.userid = TABLE2.assigned_to
GROUP BY userid;
我知道我需要以某种方式将OUID查询中的userid传递到内部查询中,以便SUM(est_hours)只获取该用户的总和。
我一直在圈子里,我的大脑很疼,所以任何帮助都会受到赞赏!!
答案 0 :(得分:3)
不要使用隐式连接语法,它是反模式
改为使用显式联接:
SELECT
t1.userid,
t1.fname,
t1.lname,
SUM(t2.act_hours)+(SELECT SUM(t3.est_hours)
FROM Table2 t3
WHERE t3.completed_date IS NULL
AND t3.assigned_to = t1.userid) AS total_hours
FROM table2 t2
INNER JOIN table1 t1 ON (t1.userid = t2.assigned_to)
GROUP BY userid;
您头痛的解决方案是使用表别名,然后您可以引用同一个表的不同实例
我强烈建议始终使用表别名重新定义所有字段,因此不会混淆字段来自哪个(实例)表。
这也会缩短您的行,使您的查询更具可读性。
答案 1 :(得分:2)
这在SQL Server中有效,在MYSQL中试用,可能有效:
SELECT userid,
fname,
lname,
(SELECT SUM(est_hours)+SUM(act_hours)
from Table2
WHERE completed_date IS NULL and TABLE2.assigned_to=TABLE1.userid) AS total_hours
FROM
TABLE1
好的,恢复原来的查询......
SELECT userid,
fname,
lname,
SUM(act_hours)+(SELECT SUM(est_hours)
from Table2
WHERE completed_date IS NULL
AND Table2.assigned_to=Table1.userid)
AS total_hours
FROM TABLE2,
TABLE1
WHERE TABLE1.userid = TABLE2.assigned_to
GROUP BY userid;