2012-02-18 7 views
0

データベースに3つのテーブルがあります。SQL Serverクエリの類似した従業員の時間の合計

最初の表は、Employee次のとおりです。

enter image description here

第二表がEmployeeTimeInである:(HoursConsumedは、秒単位での時間を持っている!)

第三表がEmployeeTimeOut次のとおりです。

enter image description here

私はそのIDによってグループ化されたすべての従業員を一覧表示し、セッション内の各時間の作業時間、次のSQLクエリを書いた:

select 
    v.EID, e.EmployeeName, v.Time_In, v.Time_Out, 
    convert(varchar(5), SUM(v.HoursConsumed)/3600) + ':' + 
    convert(varchar(5), SUM(v.HoursConsumed) % 3600/60) + ':' + 
    convert(varchar(5), (SUM(v.HoursConsumed) % 60)) as workingtime, 
    v.Date_Ref 
from 
    (select 
     e1.EID, e1.Time_In, e2.Time_Out, e1.HoursConsumed,  
     CONVERT(VARCHAR(10), e1.Date_Ref, 111) as Date_Ref 
    from EmployeeTimeIn as e1, EmployeeTimeOut as e2 
    where e1.Refid = e2.Refid) as v, Employee as e 
    where v.EID = e.EmployeeID 
    group by 
      v.EID, e.EmployeeName, v.Time_In, v.Time_Out, v.HoursConsumed, v.Date_Ref; 

それは次の出力を生成します。

enter image description here

私はこのクエリを変更して、従業員ごとに総稼働時間をworkingtime列に表示する必要があります。このシナリオでは、EID 4の場合はworkingtimeが0:41:53、EID 200の場合は0:0:39と表示されます。

(注:!最終的な出力は、私はあまりにも時間とタイムアウトファイナルテーブルのフィールドを表示する必要があるため、この例のデータのための3つの行を持つべきである)第四として

+3

明示的に使用してくださいではなく、「テーブル、テーブル」構文よりも加わります。 – pilcrow

+0

こんにちは@Nida Sulheri私は同じ問題に直面しています。あなたは私にテーブル構造を提供してもらえますか、同じものを使用してください、私は私のプロジェクトで同じロジックを実装する必要があります。よろしくご連絡ください –

+1

@ A.Goutamテーブルの構造は私の上記ポストに記載されて...テーブルのスクリーンショットを参照してください。 – Azeem

答えて

2

私はあなたが常に時間にWorkingTimeInSecondsを変換できることを前提としています

;WITH Totals(WorkingTimeInSeconds, EmployeeId, EmployeeName, DateRef) AS 
(
    SELECT 
     e.EmployeeId, 
     e.EmployeeName, 
     eti.Date_Refб 
     SUM(HoursConsumed) WorkingTimeInSeconds, 
    FROM Employee e 
    JOIN EmployeeTimeIn eti 
     ON e.EmployeeId = eti.EId 
    GROUP BY 
     e.EmployeeId, 
     e.EmployeeName, 
     eti.Date_Ref 
) 

SELECT 
    Totals.EmployeeId, 
    Totals.EmployeeName, 
    eti.Time_In, 
    eto.Time_Out, 
    eti.Ref_Date, 
    eti.WorkingTimeInSeconds 
FROM Totals 
JOIN EmployeeTimeIn eti 
    ON Totals.DateRef = eti.Date_Ref AND eti.EID=Totals.EmployeeId 
JOIN EmployeeTimeOut eto 
    ON Totals.DateRef = eto.Date_Ref AND eto.EID=Totals.EmployeeId AND eti.RefId = eto.RefId 
+0

このクエリは機能しますが、2行しか表示されません。あなたはちょうど私が追加した私の記事のNOTEを読んでくださいできますか? – Azeem

+0

@NidaSulheri更新された回答。 –

+0

ご回答いただきありがとうございます。 SQL Serverは、提供されたクエリのいくつかの点でエラーを表示します。ここからDBをダウンロードし、修正するために何ができるかを見てください。 http://www.mediafire.com/?ia0ljcvg99200vp – Azeem

0

あなたが扱うことができ、あなたの現在のクエリ結果テーブルを選択し、そこから選択合計を行います。もちろん、元のクエリの値を数値で保持する必要がありますが、消費された時間が何であるかわかりません。

select EmployeeName, sum(workingtime), date_ref 
from (
-- original query but modified to not convert strings 
select  v.EID,e.EmployeeName,v.Time_In,v.Time_Out,convert(varchar(5),SUM(v.HoursConsumed)/3600)+':'+convert(varchar(5),SUM(v.HoursConsumed)%3600/60)+':'+convert(varchar(5),(SUM(v.HoursConsumed)%60)) as workingtime,v.Date_Ref 
from ... 
) group by EmployeeName, date_ref 

また、従業員と日付で時間を取得する機能に時間計算を引き出すこともできますが、データについてはわかりません。この助けを願っています。

+0

こんにちは、HoursConsumedには秒単位の時間があります。私はあなたが "元のクエリが意味するものを理解していませんでしたが、文字列を変換しないように変更しました"という理由で、完全なクエリを貼り付けてくださいできますか...ありがとう – Azeem

+0

私の投稿の注記を参照してください。 – Azeem

関連する問題