2014-01-17 48 views
0

我有2個sql表,名爲mtblAttendancemtblLeave_Data如何以我想要的方式加入sql表

我需要從mtblLeave_Data得到所有日期,當用戶離開時取決於mtblAttendance缺席。

在我mtblAttendance每一個離開那裏是行,但如果一段所以沒有獨特的排,只有兩個列Leave_FromLeave_To(或者它可能是一個條目,其中Leave_From= Leave_To)休假用戶。

爲了得到用戶的缺席日期,我寫的查詢

USE [ILeave] 

ALTER procedure [dbo].[Attendance_Report] 
@Date1 datetime, 
@Date2 datetime, 
@User_Id nvarchar(50) 
as begin 


SELECT distinct 
a.Sno, 
a.[Login_Date], 
a.[Week_Day], 
a.[In_Time], 
a.[Out_Time], 
a.Attendance_Status, 
a.Half_Full, 
a.Leave_Type, 

(convert(varchar(max),floor (abs(cast(datediff(mi, a.Out_Time, a.In_Time) AS int)/60)))+ '.'+ convert(varchar(max),(abs(cast(datediff(mi, a.Out_Time, a.In_Time) AS int) % 60)))) as Hrs 


, l.[Sno] 
, l.[Leave_ID] 
, l.[User_Id] 
, l.[Dept_To] 
, l.[Leave_Type] 
, l.[Total_Leave_HR] 
, l.[Leave_From] 
, l.[Leave_To] 
, l.[Leave_Half_Full] 
, l.[Comments] 
, l.[Leave_Status] 
FROM 
[mtblAttendance] a 
LEFT JOIN [mtbl_Leave_Data] l 
    ON a.[Login_Date] BETWEEN l.[Leave_From] AND l.[Leave_To] 
    AND l.[User_Id] = a.[User_Id] where a.Login_Date between @Date1 and @Date2 and [email protected]_Id order by Login_Date 
end 

enter image description here

+1

我想我有一個想法,你的意思,但我不知道。一些真實數據的例子會很好。它讓你的問題更加清晰。我是否正確理解您的問題主要是因爲日期是某個時間段的一部分而導致您需要記錄?所以你不能真的選擇日子,但你需要一種方法來動態地生成期間的日子? – SonOfGrey

+0

如果您的問題是我認爲的問題,那麼您應該可以加入包含某個時間段內所有日期的表或函數。 [這裏](http://stackoverflow.com/questions/510012/get-a-list-of-dates-between-two-dates)是如何做到這一點很好的例子。最簡單的開始:創建一個日期列表,其中包含許多年的日期。你可以隨時加入。 – SonOfGrey

回答

0

加入表達式不限於使用等號。在連接表達式中使用「之間」。沿着這些(未經測試的)線應該工作。

select distinct A.Login_Date 
from mtblAttendance A 
inner join mtbl_Leave_Data L 
    on A.User_id = L.User_id 
    and A.Login_date between L.Leave_From and L.Leave_To 
where A.User_Id = 'sasi' AND A.Attendance_Status='A' 

根據您要做的事情,您可能需要將內連接更改爲左外連接。無論它們是否滿足連接條件,左外連接都將保留來自mtblAttendance的所有登錄日期。 (這些行將通過WHERE子句來過濾,當然)。

+0

它給出了重複的行。 – Gaurav

+0

這是因爲您在mtbl_Leave_Data中有多個滿足mtblAttendance.Login_Date的某些值的連接條件的行,或者在mtblAttendance中有多個具有相同登錄日期值的行。使用'SELECT DISTINCT'將消除它們。將CREATE TABLE語句和INSERT語句粘貼到您的問題中以獲取更多詳細信息。 –

0

下面的查詢將返回分配

SELECT 
    a.[Login_Date] 
    , l.[Sno] 
    , l.[Leave_ID] 
    , l.[User_Id] 
    , l.[Dept_To] 
    , l.[Leave_Type] 
    , l.[Total_Leave_HR] 
    , l.[Leave_From] 
    , l.[Leave_To] 
    , l.[Leave_Half_Full] 
    , l.[Comments] 
    , l.[Leave_Status] 
FROM 
    [mtblAttendance] a 
    LEFT JOIN [mtbl_Leave_Data] l ON a.[Login_Date] BETWEEN l.[Leave_From] AND l.[Leave_To] 
WHERE 
    a.User_Id = 'sasi' 
    AND a.Attendance_Status='A' 

我把它改成一個fiddle請假記錄,但沒有數據,所以我只能說的是查詢解析。

正如有人以前所說的那樣,通常會有帶有日期的表格,從而可以快速評估需要2年內每個日期的查詢。

更新SQL:

SELECT DISTINCT 
    a.[Login_Date] 
    , l.[Sno] 
    , l.[Leave_ID] 
    , l.[User_Id] 
    , l.[Dept_To] 
    , l.[Leave_Type] 
    , l.[Total_Leave_HR] 
    , l.[Leave_From] 
    , l.[Leave_To] 
    , l.[Leave_Half_Full] 
    , l.[Comments] 
    , l.[Leave_Status] 
FROM 
    [mtblAttendance] a 
    LEFT JOIN [mtbl_Leave_Data] l 
     ON a.[Login_Date] BETWEEN l.[Leave_From] AND l.[Leave_To] 
     AND l.[userId] = a.[user_id] -- Ensure only attendance/leave for the same user being linked 
WHERE 
    a.User_Id = 'sasi' 
    AND a.Attendance_Status='A' 
+0

它也給出了重複的行。 – Gaurav

+0

查看我的新查詢 – Gaurav

+0

如果他們完全重複,您可以執行SELECT DISTINCT操作,如何更新我創建的小提琴以包含一些數據,以便我們更輕鬆地查看我們是否有所幫助。出席或離開表時,'sasi'用戶的記錄是否存在重複或衝突的記錄? (即有一個日期有兩個假期條目?)我注意到我的查詢並沒有限制離開表的用戶ID,所以這可能導致問題,就好像另一個用戶離開了一個'sasi'出席重疊的日期那樣會有多行。 – talegna

相關問題