1

2つのSQLテーブルがあります。会社の従業員向けです。1つのテーブルには通常の詳細(id、name、surname)があり、別のテーブルにはそれらの休暇情報(empid *従業員テーブルのidへの外部キー、datefrom、dateto)があります

日付を表示できるように、休暇の構造を分解する必要がありました。出力には、次のようになります。DateFrom DateT 18-01-2013 19-01-2013

これで、従業員が1か月を超える休暇を取得した場合(つまり、29から5になります)、次のように値を出力します。DateFrom DateT 29-01-2013 31-01-2013 01-02-2013 2013年5月2日

これを印刷するために、私は月ごとに日付範囲を分割することを使用しました 。これは、その回答に感謝します。しかし、どの従業員がすべての休暇を取得しているのかを表示するにはどうすればよいですか?私が言ったように、テーブルはリンクされています。使ってみました

select
    e.Firstname,
    e.Surname,
    e.MobileNum,
    convert(varchar(11),case when DateFrom > MonthStart then DateFrom else MonthStart end) as BeginDate,
    convert(varchar(11),case when DateTo < MonthEnd then DateTo else MonthEnd end) as EndDate

from(
    select l.*,
    (
        dateadd(month,datediff(month,0,l.datefrom)+v.number,0)
    ) as MonthStart,
    DATEADD(day,-1,
        dateadd(month,datediff(month,0,l.datefrom)+v.number+1,0)
    ) as MonthEnd

from EmployeeLeave l, Employees E
     inner join master..spt_values v on v.type='P' 
     and v.number between 0 and DATEDIFF(month,l.datefrom,l.dateto)
) s 

しかし、マルチパート識別子をバインドできなかったというエラーが表示されます。そして私は言う場所を見つけることができません

where l.empid = e.empid

誰かがこれを修正する方法を教えてもらえますか?休暇を取っている従業員に会いたい

4

1 に答える 1

1

ここでEmployeeLeaveとEmployeesに参加します。

from EmployeeLeave l inner join Employees E
on l.empid = e.id
 inner join master..spt_values v on v.type='P' 
 and v.number between 0 and DATEDIFF(month,l.datefrom,l.dateto)

ここで従業員からフィールドを選択します。

from(
select l.*, e.FirstName, e.Surname, e,MobileNum
(
    dateadd(month,datediff(month,0,l.datefrom)+v.number,0)
) as MonthStart,  etc

次に、これを変更します。

select e.Firstname, e.Surname, e.MobileNum

これに

select s.Firstname, s.Surname, s.MobileNum

その理由は、実際の従業員テーブルではなく、sという名前の派生テーブルから選択しているためです。

于 2013-03-26T12:35:57.393 に答える