2017-04-13 5 views
0

:私はWHERE addedby = 1を持っているところMySQLの派生表の問題

AddedById,AddedByName,HoursWorked,CurrentYearlyFlexiAvailable 

はしかし、私はこれを交換したいのですがフィールド名AddedById全体的なクエリとしてこの値をハードコードしたくないので、複数の人が返されますので、私はこの値をrpt_timesheet_dataビューから取得したいと考えています。 CurrentYearlyFlexiAvailableフィールドは、彼らがTTL

として SELECT SUM(TTL)間と から(SELECT SUM(働いていた)-420 FROM計算を行うことにより、これまでに現在の年のために残っているどのくらいの時間が私に言ってする必要があります
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句'

だけその1つの場所。私はこれを並べ替えるためにさまざまなクエリを試したが、それを把握することはできません。私がしたいことを私の頭の中で見ることができます。

ここでは、1人のユーザーの結果を返すという点で非常に似ているクエリです。

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