0

選択した日付にタイムシートを返さなかった人のリストを表示するビジネス オブジェクト レポートを書き込もうとしていますが、個人の複数のエントリを返す SQL クエリを停止する方法がわかりません。

My Staff_Table には 2 つの列が含まれています - Employee No & Name My Timesheet_Table には、特に Employee No & Week_Ending_Date が含まれています。

Week_Ending_Date が 10/08/2012 などのタイムシートに入力したすべてのユーザーを返すステートメントを簡単に作成できます。ただし、2012 年 8 月 10 日のタイムシートを入力していないすべての人のリストを返そうとすると、その日付を持たないテーブル内のすべてのタイムシートが取得されます。 100 のタイムシートを提出し、そのうちの 1 つだけが 2012 年 10 月 8 日の場合、結果は彼を 99 回表示します。私が必要としているのは、Staff_Table でその日付に提出していない全員の固定リストで、1 回だけ表示されます。

NOT EXISTS で Union を試しましたが、やり方が間違っているか、単に適切ではありません。

誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

2

最初にタイムシートに入力されていないすべての従業員番号を選択する必要があります。次に、NOT IN を使用してリストをフィルター処理します。

DECLARE @Week_Ending_Date DATETIME = '2012-08-10'
DECLARE @Staff TABLE
(
    EmployeeNo INT NOT NULL,
    EmployeeName NVARCHAR(100) NOT NULL
)
DECLARE @TimeSheet TABLE
(
    EmployeeNo INT NOT NULL,
    Week_Ending_Date DATETIME
)

INSERT INTO @Staff (EmployeeNo, EmployeeName)
VALUES (1, 'Alan'), (2, 'Peter')

INSERT INTO @TimeSheet (EmployeeNo, Week_Ending_Date)
VALUES (1, '2012-08-10'), (1, '2012-08-17'), (2, '2012-08-03')

SELECT
    S.EmployeeName
FROM
    @Staff S
WHERE
    EmployeeNo NOT IN (SELECT EmployeeNo FROM @TimeSheet WHERE Week_Ending_Date = @Week_Ending_Date)
于 2012-08-17T09:57:18.913 に答える
1

not exists節を使用して、特定のタイムシートを提出していないスタッフを見つけることができます。

select  *
from    Staff s
where   not exists
        (
        select  *
        from    Timesheet t
        where   t.EmployeeNo =  s.EmployeeNo
                and t.Week_Ending_Date = '2012-08-19'
        )
于 2012-08-17T09:53:55.933 に答える
1

クエリに DISTINCT を追加してみてください

すなわち

SELECT DISTINCT ...

クエリは次のようになります

SELECT * 
FROM Staff
WHERE NOT EXISTS 
(
    Select EmployeeNo 
    from Timesheet 
    where WeekEndingDate='2012-08-10'     
    and TimeSheet.EmployeeNo  = Staff.EmployeeNo 
)

また

SELECT * 
FROM Staff
WHERE EmployeeNo NOT IN 
(
    Select EmployeeNo 
    from Timesheet 
    where WeekEndingDate='2012-08-10'
)
于 2012-08-17T09:49:49.630 に答える
0

タイムシートを提出していないすべての従業員を選択して、その結果を名前でグループ化することはできませんか?

select Name
from Staff_Table
left join Timesheet_Table on Staff_Table.[Employee No] = Timesheet_Table.[Employee No] and  Timesheet_Table.Week_Ending_Date = '10 August 2012'
having Timesheet_Table.Week_Ending_Date is null
group by Name, Timesheet_Table.Week_Ending_Date

私はこれをテストしていませんが、これらの線に沿ったものです。

于 2012-08-17T09:55:34.093 に答える