2011-06-29 3 views
0

ワークステーションで各バッチを処理した合計時間、完了した推定作業の総数、ユーザーの支払額、およびユーザーが今年毎日何回失敗したかを調べようとしています。このすべてを1つのクエリにまとめることができれば、ピボットテーブルなどでExcelや書式をうまく使用することができます。1つのテーブルを別のテーブル(たとえば、userid = userid)に結合するにはどうしますか?

EDIT:参加

SELECT batch_log.userid, 
batches.operation_id, 
SUM(TIME_TO_SEC(ramses.batch_log.time_elapsed)), 
SUM(ramses.tasks.estimated_nonrecurring + ramses.tasks.estimated_recurring), 
DATE(start_time) 
FROM batch_log 
JOIN batches ON batch_log.batch_id=batches.id 
JOIN ramses.tasks ON ramses.batch_log.batch_id=ramses.tasks.batch_id 
JOIN protocase.tblusers on ramses.batch_log.userid = protocase.tblusers.userid 
WHERE DATE(ramses.batch_log.start_time) > "2011-01-01" 
AND protocase.tblusers.active = 1 
GROUP BY userid, batches.operation_id, start_time 
ORDER BY start_time, userid ASC 

クロスが問題を引き起こしていた:私はこれまでの私の範囲を狭くしているので、それが複数のクエリでこれを行うためにのみ可能である実現しました。

答えて

1

いいえ、一般にHaving句は、の結果をフィルタリングするために使用されます。たとえば、1日に24時間以上支払われた人のみを報告します(HAVING SUM(ramses.timesheet_detail.paidTime) > 24)。集計結果のフィルタリングを実行する必要がある場合を除き、having句はまったく必要ありません。
これらの条件のほとんどは、where節に、または結合の一部として、2つの理由で移動する必要があります。1)フィルタリングは、一般的に、できるだけ早く実行して、クエリが実行する必要がある作業を制限する必要があります。 2)フィルタリングが既に行われている場合は、それを再作成すると、不要な追加の作業がクエリで実行される可能性があります。
これまでに見てきたことから、今日までにロールアップしようとしていることがわかります。group by句の最後の列をdate(ramses.batch_log.start_time)に変更するか、(私が想定している通りに)タイムスタンプ


EDIT:スキーマ名について
- はい、あなたは彼らが fromjoinセクションに名前を付けることができます。しばしば、クエリは、デフォルトの検索リスト(データベースがどのように設定されているかによって異なります)に基づいて、必要なスキーマを解決することができます。ここ
は、私は、クエリを再フォーマットしているだろうかです:特に懸念される

SELECT tblusers.userid, operations.name AS name, 
SUM(TIME_TO_SEC(batch_log.time_elapsed)) AS time_elapsed, 
SUM(tasks.estimated_nonrecurring + tasks.estimated_recurring) AS total_estimated, 
SUM(timesheet_detail.paidTime) as hours_paid, 
DATE(start_time) as date_paid 
FROM tblusers 
JOIN batch_log 
ON tblusers.userid = batch_log.userid 
AND DATE(batch_log.start_time) >= "2011-01-01" 
JOIN batches 
ON batch_log.batch_id = batches.id 
JOIN operations 
ON operations.id = batches.operation_id 
JOIN tasks 
ON batches.id = tasks.batch_id 
JOIN timesheet_detail 
ON tblusers.userid = timesheet_detail.userid 
AND batch_log.start_time = timesheet_detail.for_day 
AND DATE(timesheet_detail.for_day) = DATE(start_time) 
WHERE tblusers.departmentid = 8 
GROUP BY tblusers.userid, name, DATE(batch_log.start_time)  
ORDER BY date_paid ASC 

は(あることを暗示しているもの)のタイムスタンプを比較しているbatch_log.start_time = timesheet_detail.for_dayライン、です。これらは本当に等しいのですか?私は、これらの一方または両方をdate()関数でラップする必要があると考えています。

なぜあなたが予期しないデータを取得している可能性がありますか?参加条件のいくつかが削除されているようです。あなたのデータベースの正確なセットアップと使用を知らなければ、私はあなたの結果の正確な理由(あるいはそれらが間違っていると言うことさえできません)を与えることはできませんが、joinの条件なしでoperationsテーブルに加わるという事実はおそらく非難 - そのテーブルに2つのレコードがある場合、以前のすべての結果が2倍になり、12があるように見えます。group by句からoperations.nameを削除しました。私はあなたのテーブル関係の残りの部分を調べて、それ以上の制限があるかどうかを確認します。

+0

はい。申し訳ありませんが、私の質問はすごく言い換えられました。私はこのSQLのもので私の要素のようにしている。私は約2年の開発者であり、SQLのほとんどは作業の90%を占めています。私はSQLと一緒に行く方法があることを知っている。 – davidahines

+0

更新されたバージョン – davidahines

+0

の質問を編集しましたまた、インデントのないファイルを読むのは難しいかもしれませんが、実際にはSQLの適切なコーディングスタイルがわからない – davidahines

関連する問題