2014-06-26 112 views
0

我有一個問題,我根本無法弄清楚。我有一個不同旅行日期的員工名單,我想以級聯列表格式顯示所有人。問題是我只想看到員工一次,只有最接近今天的日期。訪問SQL查詢:比較選擇語句中的日期

例如,我可以在那裏多次使用'Smith',日期在今天之前和之後,因爲我們也保留了歷史記錄。這意味着我不能只做分鐘,因爲它會嘗試在今天之前顯示一個日期,並且max太遠了。

下面的代碼示例ALMOST工作。問題出在select語句中。我想在今天之後顯示最短的日期,但是在日期應該是0和-1的情況下。可能還有另一種方法可以一起完成此操作,但這是唯一似乎允許其他信息(如站點,位置和註釋)與其一起正確顯示的配置。

SELECT A.`Last Name` AS [Last Name], Min(A.`Date In`) > Now() AS [Date In], Max(B.Site) AS Site, Max(B.Position), Max(B.Comments) AS Comments 
FROM Deployments AS A 
INNER JOIN Deployments AS B ON A.ID = B.ID 
GROUP BY A.`FSR Name` 
HAVING (((Max(A.`Actual TEP IN`))>Now())); 

我按名稱做了一個組,因爲我只想看到每個人一次。如果我不通過連接將表添加到自身,它會給出自我引用錯誤。這是我第一次發佈,所以我希望這是有道理的!所有幫助將不勝感激!

+3

您使用的數據庫是?您正在將SQL Server/Sybase約定與MySQL約定混合使用。另外,你爲什麼要做自我加入。這個不成立。 –

+0

對不起,我正在使用MS Access – user3779582

回答

0

不知道你在使用什麼數據庫,但一般情況下,你需要返回MIN(日期)而不是比較結果「Min(Date)> Now()」 - 我猜這是在哪裏你會看到0和-1,因爲這是比較的結果,當你想要自己的最小日期值時。另外,如果你只是想要將來有旅行日期的人,只要用WHERE子句限制你的查詢,做一個GROUP BY,並且你擺脫了自我連接。還請注意,下面的示例將您的OP中的一些差異與您根據「姓氏」選擇的位置進行比較,但將其分組到「FSR名稱」 - 這些內容必須一致,無論您擔心哪個字段。

例子:

SELECT A.[FSR Name] AS [FSR Name], 
    Min(A.[Date In]) AS [Date In], 
    Max(A.Site) AS Site, 
    Max(A.Position) AS Position, 
    Max(A.Comments) AS Comments 
FROM Deployments AS A 
WHERE A.[Date In] > Now() 
GROUP BY A.[FSR Name]; 

編輯:如果你需要確保網站,位置,評論都來自同一行,你必須這樣做的其中一個選項:

如果你有一個主鍵:

select * from Deployments A3 where A3.pk_value = 
    (select max(A2.pk_value) from Deployments A2 
    where A2.[Date In] = 
     (select Max([Date In]) from Deployments A where A.[FSR Name] = A2.[FSR Name]) 
    and A2.[FSR Name] = A3.[FSR Name] 
    ) 

這樣可以保證你獲得1行每FSR名稱,即使有與相同的「最新」的日期是FSR多行。否則,您可以省略處理pk_value的輔助查詢,但是對於具有多個具有相同「最新」日期的記錄的FSR,您可能會獲取多行的風險。

注意:當您開始查詢這個複雜的,運行於全功能數據庫(SQL Server,Oracle,除Access之外的其他任何軟件)時,您可以使用更復雜的功能。對於這個例子,「窗口函數」會給你答案沒有太多的爭論。不知道你現在是否被Access困住了,但無論如何都要考慮到這一點。

+0

我重新格式化爲以下內容: 'SELECT'Last Name'AS [Last Name], Min('Date In')AS [Date In], Max(Site )AS Site, Max(Position)AS Position, Max(Comments)AS Comments FROM Deployments GROUP BY'Last Name' WHERE'Date In'> Now(); ' '但它給了我這個錯誤 - 「語法錯誤(缺少操作符)在查詢表達式''姓''WHERE'日期在'>現在()'我也道歉,但我不知道如何格式化評論讓它看起來更好 – user3779582

+0

我原來的GROUP BY後面會出現WHERE,這會導致語法錯誤,現在上面的答案已經解決了,對不起! – SlimsGhost

+0

嗯,它越來越接近了!現在告訴我我有一個循環引用我發現在你的回覆中你仍然有部署AS A,但是沒有部署AS B,應該再次在那裏嗎?編輯:我把它放進去了,它工作了!唯一奇怪的是Access當我運行查詢時要求輸入名稱和日期,如果我輸入了什麼,它會輸出正確的信息。我想知道如何讓它不要求輸入? – user3779582

0

嘗試這樣的事情

Select A.LastName, A.DateIn, A.Site, A.Position, A.Comments 
From deployments a 
Where not exists (Select * 
       From deployments b 
       Where b.id <> a.id 
       and  (abs(datediff(d, getdate(), a.datein))) > abs(datediff(d, getdate(), b.datein)) 
       or abs(datediff(d, getdate(), a.datein)) = abs(datediff(d, getdate(), b.datein) and a.id > b.id)) 

取而代之的是搞笑分鐘和馬克塞斯您正在使用,試圖獲得與最接近今天datein行,請嘗試使用DATEDIFF。使用此功能,您可以指定要比較哪種日期或時間值(日,月,年,分),然後查找兩個不同日期時間之間的差異。在這種情況下,我使用getdate()來查找當前的日期和時間。然後,我們要爲dateiff值最小的datein,即最接近今天的datein。 Datediff將返回正值或負值,所以我使用abs來獲得結果的絕對值。我這樣做是因爲如果日期在今天之前或今天之後,無關緊要。

然後我們正在查看部署表。子查詢表示我們應該查看所有不是當前值的值。然後,查找所有具有比當前記錄更小的datediff的行。此外,找到所有與當前記錄相同的記錄以及較小的記錄。如果沒有符合此標準的任何內容,我們將只包含當前記錄。這是一個有點奇怪的想法,但這種類型的查詢應該可以幫助你更容易地找到你正在尋找的東西。唯一的問題是,您需要在子查詢的where子句中添加條件以確定要比較的條目。就目前而言,該查詢將查看部署表中的所有條目,並將具有最接近今天的日期的一行撤回。既然你想爲每個人一行,這將需要更多的規格。

+0

嗯,我給了這個鏡頭,但它給出了一個錯誤,說明它太複雜,評估或輸入不正確。我也不確定它是否會將網站/位置/評論適當地鏈接起來。 – user3779582

+0

@ user3779582剛看了一遍,我肯定錯過了幾個parens。正如我的答案所解釋的,您需要在子查詢的where子句中添加一些內容。我不確定'id'是什麼。如果你有幾個史密斯的記錄,每個記錄是否有自己的ID或他們都是一樣的? – Jenn

+0

不幸的是,我正在處理的數據庫以姓氏的形式使用Natural Keys。所以是每個記錄的每個ID是不同的。我遇到的問題是,即使來自其他人的答案,我也無法讓這兩件事情相匹配。即使我使用簡化方法,我也無法弄清楚它的邏輯。我會認爲有A.ID = B.ID就夠了,但我猜不是嗎? – user3779582