MySQL派生表问题
我希望能够从以下查询中输出以下字段:MySQL派生表问题,mysql,sql,derived-table,Mysql,Sql,Derived Table,我希望能够从以下查询中输出以下字段: AddedById,AddedByName,HoursWorked,CurrentYearlyFlexiAvailable 然而,当我的where addedby=1时,我想用字段名AddedById替换它,因为我不想硬编码这个值,因为整个查询应该并将返回多个人,我想从rpt_timesheet_数据视图中获取这个值,它就在那里。CurrentYearlyFlexiAvailable字段应该告诉我,通过在SELECT SUMttl和from SELECT
AddedById,AddedByName,HoursWorked,CurrentYearlyFlexiAvailable
然而,当我的where addedby=1时,我想用字段名AddedById替换它,因为我不想硬编码这个值,因为整个查询应该并将返回多个人,我想从rpt_timesheet_数据视图中获取这个值,它就在那里。CurrentYearlyFlexiAvailable字段应该告诉我,通过在SELECT SUMttl和from SELECT SUMworked-420 as ttl之间进行计算,他们在当前年份至今还剩多少时间
但我一直得到:
错误代码:1054。“where子句”中的未知列“AddedById”
就在那个地方。我尝试了各种查询来对其进行排序,但就是想不出来。对不起,我不擅长解释这一点,我可以在脑海中看到我想做什么
下面是一个查询,其功能非常类似,它返回单个用户的结果,其中,如上所述的查询旨在循环所有用户并给出结果:-
SELECT addedbyname, SUM(ttl) -
(SELECT SUM(worked)
FROM vwtimesheet
WHERE addedby=1
AND entrydate BETWEEN '2017-01-01' AND '2017-04-13'
AND activityid=3192
GROUP BY addedby ) AS CurrentYearlyFlexiAvailable
,(SELECT SUM(worked) FROM vwtimesheet
WHERE addedby=1
AND entrydate BETWEEN '2017-01-01' AND '2017-04-13'
AND activityid=3192
GROUP BY addedby ) AS flexiused
,(SELECT sum(worked) FROM vwtimesheet
WHERE addedby=1
AND entrydate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01') AND curdate()
AND activityid=3192
GROUP BY addedby ) as fleximonthused
FROM ( SELECT entrydate,addedbyname,SUM(worked)-420 AS ttl FROM vwtimesheet
WHERE addedby=1
AND entrydate BETWEEN '2017-01-01' AND '2017-04-13'
AND projectid<>113
AND activityid<>3192
GROUP BY entrydate,addedbyname
HAVING SUM(worked)>420
) AS s
请尝试以下方法
SELECT AddedById,
AddedByName,
SUM( HoursWorked ) AS HoursWorked,
SUM( ttl ) - sumWorked AS CurrentYearlyFlexiAvailable
FROM ( SELECT AddedById AS AddedById,
AddedByName AS AddedByName
FROM rpt_timesheet_data
GROUP BY AddedById
) AS AddedByFinder
JOIN ( SELECT addedby AS addedby,
entrydate AS entrydate,
SUM( worked ) - 420 AS ttl
FROM vwtimesheet
WHERE entrydate BETWEEN '2017-01-01' AND '2017-04-13'
AND projectid <> 113
AND activityid <> 3192
GROUP BY addedby,
entrydate
HAVING SUM( worked ) > 420
) AS ttlFinder ON AddedByFinder.AddedById = ttlFinder.addedby
JOIN ( SELECT addedby AS addedby,
SUM( worked ) AS sumWorked
FROM vwtimesheet
WHERE entrydate BETWEEN '2017-01-01' AND '2017-04-13'
AND activityid = 3192
GROUP BY addedby
) sumWorkedFinder ON AddedByFinder.AddedById = sumWorkedFinder.addedby
WHERE entrydate BETWEEN '2017-04-02' AND '2017-04-13 23:59:59'
AND ActivityId = 3192
GROUP BY AddedById,
AddedByName
ORDER BY AddedByName;
接下来的解释
如果您有任何问题或意见,请随时发表相应的意见。也许您应该问另一个问题。或者至少认真编辑一下这个。提供示例数据、所需结果,并描述您试图实现的逻辑。在内部查询中,您需要包括您要应用分组的字段。我将尝试更正您的代码,并在短时间内发布答案。您可能会发现阅读此内容很有帮助。您想做什么?哦,请稍候。我已更新了我的答案。请尽快回复我。谢谢@toonice,这正是我所需要的。我很快就会得到解释-我有点偏离了方向。可能很快就会和你交谈,出于某种原因,返回的ttl值实际上翻了一番,这使得ttl-sumWorked作为CurrentYearlyFlexibleAvailable计算的总和被抛出。如果我只是在自己的连接上运行第一个连接查询,那么我得到的值列表都是正确的,但是当ttl在连接之外使用时似乎是正确的
SELECT AddedById,
AddedByName,
SUM( HoursWorked ) AS HoursWorked,
SUM( ttl ) - sumWorked AS CurrentYearlyFlexiAvailable
FROM ( SELECT AddedById AS AddedById,
AddedByName AS AddedByName
FROM rpt_timesheet_data
GROUP BY AddedById
) AS AddedByFinder
JOIN ( SELECT addedby AS addedby,
entrydate AS entrydate,
SUM( worked ) - 420 AS ttl
FROM vwtimesheet
WHERE entrydate BETWEEN '2017-01-01' AND '2017-04-13'
AND projectid <> 113
AND activityid <> 3192
GROUP BY addedby,
entrydate
HAVING SUM( worked ) > 420
) AS ttlFinder ON AddedByFinder.AddedById = ttlFinder.addedby
JOIN ( SELECT addedby AS addedby,
SUM( worked ) AS sumWorked
FROM vwtimesheet
WHERE entrydate BETWEEN '2017-01-01' AND '2017-04-13'
AND activityid = 3192
GROUP BY addedby
) sumWorkedFinder ON AddedByFinder.AddedById = sumWorkedFinder.addedby
WHERE entrydate BETWEEN '2017-04-02' AND '2017-04-13 23:59:59'
AND ActivityId = 3192
GROUP BY AddedById,
AddedByName
ORDER BY AddedByName;