【问题标题】:MySQL Derived Table IssueMySQL派生表问题
【发布时间】:2017-09-09 16:37:07
【问题描述】:

我希望能够从下面的查询中输出以下字段:

AddedById,AddedByName,HoursWorked,CurrentYearlyFlexiAvailable

但是,我有 WHERE addedby=1,我想将其替换为字段名称 AddedById,因为我不想将此值硬编码为整体查询应该并且将返回多个人,我想从 rpt_timesheet_data 视图中获取此值,该视图在那里。 CurrentYearlyFlexiAvailable 字段应该通过 SELECT SUM(ttl)FROM (SELECT SUM(worked) -420 为 ttl

SELECT AddedById,AddedByName,SUM(HoursWorked) AS HoursWorked 
,(SELECT SUM(ttl) - (
                SELECT SUM(worked) 
                FROM vwtimesheet
                WHERE addedby=AddedById 
                AND entrydate BETWEEN '2017-01-01' AND '2017-04-13' 
                AND activityid=3192 
                GROUP BY addedby ) AS flexihours 

        FROM (
            SELECT SUM(worked)-420 AS ttl 
            FROM vwtimesheet 
            WHERE addedby=1 <!--HERE IS THE ISSUE
            AND entrydate BETWEEN '2017-01-01' AND '2017-04-13' 
            AND projectid<>113 AND activityid<>3192 
            GROUP BY entrydate 
            HAVING SUM(worked)>420
        ) AS s) AS CurrentYearlyFlexiAvailable
FROM rpt_timesheet_data
WHERE entrydate BETWEEN '2017-04-02' AND '2017-04-13 23:59:59' 
AND ActivityId=3192 
GROUP BY AddedById,AddedByName 
ORDER BY AddedByName

但我不断得到:

错误代码: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 

【问题讨论】:

  • 也许你应该问另一个问题。或者至少认真编辑这个。提供示例数据、期望的结果,并描述您尝试实现的逻辑。
  • 在您的内部查询中,您需要包含您应用GROUP BY 的字段。我将尝试更正您的代码并尽快发布答案。
  • 您可能会发现阅读此meta.stackoverflow.com/questions/271055/… 会有所帮助
  • 你想做什么?

标签: mysql sql derived-table


【解决方案1】:

请尝试以下...

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;

(后面的解释……)

如果您有任何问题或cmets,请随时发表相应的评论。

【讨论】:

  • 糟糕,请稍等。
  • 我已更新我的答案。请回复我的进展情况。
  • 感谢@toonice,正是我所需要的。
  • 我很快就会给出这个解释 - 我有点跑题了。
  • 可能很快就谈过了,由于某种原因,返回的 ttl 值实际上是加倍的,这会抛出 SUM(ttl) - sumWorked AS CurrentYearlyFlexiAvailable 计算出来。如果我只是自己运行第一个连接查询,那么我得到的值列表都是正确的,但似乎是 ttl 然后在连接之外使用
猜你喜欢
  • 1970-01-01
  • 2017-04-30
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-22
  • 2012-04-23
相关资源
最近更新 更多