2017-04-13 10 views
0

필드 이름 AddedById 전체 쿼리로이 값을 하드 코딩하지 않고 한 명 이상을 반환해야하므로 rpt_timesheet_data보기에서이 값을 가져오고 싶습니다. CurrentYearlyFlexiAvailable 필드SELECT SUM (TTL) 사이의 계산을 수행하여과 (SUM을 선택에 에서 그들이 일 현재 올해 남은 시간이 얼마나 말해해야한다 (TTL로) -420 근무MySQL의 파생 테이블 문제

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 알 수없는 열 'AddedById' 'where 절'

그냥 그 한 위치에. 나는 이것을 정렬하기 위해 다양한 쿼리를 시도했지만, 그것을 알아낼 수 없다. 미안,이 일을 내 머리 속에서 볼 수 있습니다.

다음은 단일 사용자에 대한 결과를 반환한다는 점에서 매우 유사한 작업을 수행하는 쿼리입니다.

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 
+1

아마도 다른 질문을해야합니다. 또는 적어도 심각하게 편집하십시오. 샘플 데이터와 원하는 결과를 제공하고 구현하려는 로직을 설명하십시오. –

+0

내부 쿼리에서'GROUP BY'를 적용 할 필드를 포함해야합니다. 나는 당신의 코드를 정정하고 곧 답변을 올리려고 노력할 것입니다. – toonice

+0

이 내용을 읽는 것이 도움이 될 수 있습니다. https://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-question/271056#271056 –

답변

0

다음을 시도하십시오 ...

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; 

(설명이 따라 ...)

당신이 만약 -이 : 위의 결과를 모든 사용자 통해 루프를 의미하고 저를 줄입니다 있다 질문이나 의견이 있으시면 언제든지 의견을 게시하십시오.

+0

죄송합니다. 기다려주세요. – toonice

+0

답변을 업데이트했습니다. 그것이 어떻게 진행되는지 나와 함께 돌아 오십시오. – toonice

+0

@toonice에 감사드립니다. 내가 필요한 것. – Martin