Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL派生表问题_Mysql_Sql_Derived Table - Fatal编程技术网

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;