2012-08-17 49 views
0

我想寫一個業務對象報告來顯示沒有在選定的日期返回時間表的人的列表,但我不知道如何停止SQL查詢爲個人返回多個條目。SQL - 如何返回沒有倍數的結果

我Staff_Table包含2列 - 員工沒有&名稱 我Timesheet_Table包含,除其他事項外,員工沒有& Week_Ending_Date。

我可以輕鬆編寫一個語句,以返回所有已輸入時間表的用戶,並且其中的Week_Ending_Date已輸入。 2012年10月8日。但是,如果我嘗試返回所有未參加10/08/2012的時間表的人員名單,我會拿起表格中沒有該日期的每個時間表,例如,如果某人有提交了100張時間表,其中只有1張是10/08/2012,結果會顯示99次。 我需要的是Staff_Table上每個人都沒有提交的固定列表,只顯示一次。

我試過一個不存在的聯盟,但要麼我做錯了,要麼根本就不合適。

任何人都可以指向正確的方向嗎?

+0

包括查詢,將有助於在這一點上 – podiluska 2012-08-17 09:50:34

+0

我使用DISTINCT,但它並沒有幫助我在這裏。 – 2012-08-17 09:51:44

+0

我知道,我必須在發佈之前儘量稀釋查詢。它由Business Objects自動生成,幷包含所有方式的連接等。我需要過濾它以發佈以保持與我的問題一致。 – 2012-08-17 09:54:33

回答

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' 
) 
+0

應該提到,我試過了,它不會改變我的結果。 – 2012-08-17 09:51:25

+0

謝謝Podiluska和所有人。使用NOT IN命令在這裏做了訣竅。另一個教訓。謝謝。 – 2012-08-17 10:12:41

+0

Podiluska在kingkong0924之後張貼'not in',值得信任imho – Andomar 2012-08-17 10:54:56

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' 
     ) 
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 

我還沒有測試過這個,只是沿着這些線。

+0

你不能在'having'子句中使用未聚集的列 – Andomar 2012-08-17 10:07:58

+0

@Andomar好點,從來沒有測試過這個。 – 2012-08-17 10:14:18

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)