2012-09-06 25 views
0

我正在爲我工​​作的公司的桌面支持團隊編寫一份報告。該報告需要在從ASP.NET應用程序傳入的指定時間範圍內生成一組新的起始者。目前我們的Worker表和Contract表之間有一對多的關係。我們聘請了很多承包商,他們有時會在幾個月後回來,但由於新機器需要與桌面空間一起配置,因此仍然被視爲新起點。SELECT MAX()包含在DATEDIFF中()

爲每個薪酬審查,職位變更和新創辦人添加新合同。我們需要濾除除新手之外的所有人。自然而然地,在上一份合同的結束日期之後的一天,添加了用於工作變更和付款審覈的最新合同。由於我只是在事情的宏偉計劃中更新鮮,我正努力嘗試使用一組函數來實現我的目標。

WHERE  
(dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF) AND DATEDIFF(day, SELECT MAX(StartDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID, SELECT MAX(EndDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID)> 1 

我基本上要找出員工有一個以上的合同情況下,無論離開,回來的還是要檢討,如果當前活躍的合約是一個天差地別到以前的合同。這應該通過我的想法給我所有的新手首先。

麻煩是我仍然試圖讓我的頭在何時使用聚合函數不在選擇和何時應用HAVING子句。

任何幫助,將不勝感激,幫助我理解爲什麼我的理解不足導致此查詢/邏輯失敗。

感謝

編輯

好吧,我還是撲掉在這個解決方案,這是語法不正確。爲了消除這裏的一些含糊之處,就是查詢和更新;

Declare @StartDateF varchar(10) 

    Set @StartDateF = '2012-08-03' 

    Declare @EndDateF varchar(10) 
    Set @EndDateF = '2012-09-04' 


    SELECT w1.Worker_ID, w1.Title, w1.FirstName, w1.Surname,w1.Gender, w1.DateofBirth, 
      dbo.[Contract].StartDate, (select w2.surname + ',' + w2.firstname from worker w2 WITH (NOLOCK) where w2.worker_ID = w1.manager)as Manager, dbo.Grade.GradeDescription AS JobTitle, dbo.Grade.Discipline, 
      CASE WHEN dbo.[Contract].ContractType_ID = 1 OR dbo.[Contract].ContractType_ID = 2 OR dbo.[Contract].ContractType_ID = 5 OR dbo.[Contract].ContractType_ID = 6 
      THEN 'Staff' ELSE 'Contractor' END AS ContractType 
    FROM dbo.Worker w1 WITH (NOLOCK) inner join 
     dbo.[Contract] WITH (NOLOCK) ON dbo.[Contract].Worker_ID = w1.Worker_ID inner join 
     dbo.Grade WITH (NOLOCK) ON dbo.Grade.Grade_ID = dbo.[Contract].Grade_ID 
    WHERE 

    (dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF AND EndDate IS NULL) 

    group by 
    w1.Worker_ID, w1.Title, w1.FirstName, w1.Surname,w1.Gender, w1.DateofBirth, 
      dbo.[Contract].StartDate, manager, dbo.Grade.Discipline,dbo.Grade.GradeDescription, dbo.[Contract].ContractType_ID 

    Having DATEDIFF(day, SELECT MAX(StartDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID, SELECT MAX(EndDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID) 

我已經加入由having子句中的組,但現在我收到以下錯誤

消息156,級別15,狀態1,行24 不正確的語法關鍵字接近「SELECT」。 Msg 102,Level 15,State 1,Line 24 ','附近語法不正確。 Msg 102,Level 15,State 1,Line 24 ')'附近語法不正確。

這些都涉及到毫無疑問你可以看到的條款中的功能。但我不明白這個查詢有什麼問題,主要是這個問題。我需要足夠的瞭解SQL函數,以便我可以實現正確的解決方案。

我已隨訪這裏http://msdn.microsoft.com/en-us/library/ms189794.aspx

的DATEDIFF()函數I可以看到,在使用該功能中的函數根據MS文檔是可接受的。

編輯

註釋掉having子句給了我期望的結果集。它向人們展示與更改合同(加薪),但這是信息,沒有人應該看到,這些都是現在需要過濾掉

編輯

我已經做了一些改進,克服了只記錄錯誤消息,但是我仍然收到發生工資上漲的人。這裏是選自以

group by 
w1.Worker_ID, w1.Title, w1.FirstName, w1.Surname,w1.Gender, w1.DateofBirth, 
     dbo.[Contract].StartDate, manager, dbo.Grade.Discipline,dbo.Grade.GradeDescription, dbo.[Contract].ContractType_ID, w1.Worker_ID 
Having 

(((dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF) 
AND COUNT(dbo.[Contract].Worker_ID) = 1) 

OR 

((dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF) 
AND DATEDIFF(day, (SELECT MAX(EndDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID), (SELECT MAX(StartDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID))>1)) 

回答

0
WHERE ((dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF)AND dbo.[Contract].Worker_ID 
     IN (select worker_id from dbo.[Contract] 
     group by worker_id 
     having count(worker_id) = 1)) 

    OR 

    ((dbo.[Contract].StartDate BETWEEN @StartDateF AND @EndDateF) 
    AND DATEDIFF(day, (SELECT MAX(EndDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID), (SELECT MAX(StartDate)FROM dbo.[Contract] WHERE dbo.[Contract].Worker_ID = w1.Worker_ID))>1 
    AND dbo.[Contract].Worker_ID = w1.Worker_ID) 

現在對我的作品:)

2

修改後的查詢與一個以上的合同讓工人,你可以使用:

select c.workerID 
from Contract c 
group by c.workerID 
having count(distinct contractID) > 1 

這聽起來,不過,像你只想計算一切,但新的開始。你可以像這樣做:

select w.workerID 
from Contract c 
where c.ContractType = 'New' 
group by w.workerID 
having count(distinct contractID) > 1 

因爲你沒有提供的表格是什麼樣子的細節,輸入數據看起來像什麼樣,你想達到的結果,這是關於最好的這可以做到。

+0

謝謝,是的,你說得對,沒有足夠的細節。我最糟糕的情況是按照你在第二部分中概述的內容。目前,我們的合同類型表確定該員工是否是全職,兼職,實習生,承包商等,我們沒有專欄說明是新合同還是合同。 – dotnetnewb

+0

更改架構是我使用這個新字段作爲檢查的解決方案。然而這是我想要避免的。沒有任何主要原因,只是如果它是一些可以通過一點SQL解決的問題,那麼我就是爲了這一點。我可以讓所有工人擁有一個以上的合同,也就是說,如果最新的合同有一個開始日期和一個空的結束日期,與前一個合同的結束日期不同,那麼這個合同就是一天。我試圖利用DATEDIFF函數來評估合約MAX()開始日期以獲取最新的MAX()結束日期 – dotnetnewb