2014-04-28 75 views
0

這是我的存儲過程,以獲取在StartDateEndDate之間工作的員工及其小時數的列表。SQL Server存儲過程問題。從數據庫中獲取多個結果

ALTER procedure [dbo].[usp_get_employeehourlyreport] 
    @startdate datetime, 
    @enddate datetime 
as 
begin 
    select * 
    from (
     select 
     (select FullName from Registration 
      where Registration.UserId = UserTime.UserId) Fullname, 
     ISNULL(SUM(HoursWorked), 0) HoursWorked 
     from UserTime 
     where CheckIn between @startdate and @enddate 
     group by UserId, CheckIn) tbl 
end 

我得到的結果是:

Fullname    HoursWorked 
    Antonio Jake   0 
    Antonio Jake   0.016666 

所以基本上它會顯示一個額外的行與小時0我沒有在我的數據庫中的任何重複的全名。

表結構是:

USERTIME

UserTimeId int    Unchecked 
    UserId  int    Checked 
    CheckIn  datetime  Checked 
    LoginStatus nvarchar(50) Checked 
    Day   varchar(50)  Checked 
    HoursWorked float   Checked 
    Date   nvarchar(50) Checked 

REGISTRATION

UserId int Unchecked 
    FullName varchar(50) Checked 
+0

Usertime是表名。請參見第一張表。我已經提到過它。並且查詢運行完美,但會產生重複的結果。 – user2525244

回答

1

嘗試是這樣的....

ALTER procedure [dbo].[usp_get_employeehourlyreport] 
@startdate datetime, 
@enddate datetime 
AS 
BEGIN 
SET NOCOUNT ON; 

    SELECT R.FullName, ISNULL(SUM(UT.HoursWorked),0) AS Total_Hours 
    FROM Registration R LEFT JOIN USERTIME UT 
    ON R.UserId = UT.UserId                             Fullname ,ISNULL(SUM(HoursWorked),0) HoursWorked from UserTime 
    AND UT.CheckIn >= @startdate 
    AND UT.CheckIn <= @enddate 
    GROUP BY R.FullName 
END 
+0

它不能編譯。將錯誤設置爲「Fullname附近的語法錯誤」。 – user2525244

+0

你能在我的代碼和你寫的代碼中看不到任何區別嗎?只需複製粘貼這個,它會工作,你不需要擔心使用SUM函數時的空值。你的Join語法亂糟糟,只是複製粘貼我的解決方案,它會起作用。並且還在sql服務器中使用'SUM'和'JOINS'。 –

+0

我也將INNER JOIN更改爲left join,即使他們在日期範圍內沒有任何工作,它也會返回所有用戶,它會將工作時間顯示爲'0'。 –

相關問題