2009-10-27 32 views
0

我有一個表,每個員工的多個日期欄每行的最大值:Access 2007年:確定在多個列

Emp 1, Date1, Date2, Date3 
    Emp 2, Date1, Date2, Date3 

我想編寫一個返回給我一個查詢三個日期的最大日期以每個員工爲基礎。我知道我需要編寫一個UNION ALL查詢,但我似乎無法獲得語法,以便獲得每個員工記錄的最大值。我始終爲所有員工獲得相同的價值。我確信這是一個愚蠢的錯誤,但是這讓我感到非常緊張。非常感激任何的幫助。


感謝您的及時回覆!有沒有辦法做到這一點,而不使用IIF語句?如果可能的話,我想概括一下它,因爲還有其他幾個日期字段,並且確定IIF邏輯非常困難。

此外,我忘了提及任何這些日期可能是空的,並且IIF邏輯似乎返回NULL作爲最大值。

+1

您確定此表已標準化(http://www.r937.com/relational.html)嗎? – Fionnuala 2009-10-27 14:20:31

+0

我認爲我們可以肯定地打賭,正常化問題的答案是什麼! – 2009-10-27 20:45:31

回答

0

會有這樣的工作嗎?

select 
    EmployeeColumn, 
    iff(iif(Date1 > Date2, Date1, Date2) > Date3, iif(Date1 > Date2, Date1, Date2), Date3) 
from yourTable 
+0

道歉 - 出於某種原因,我對此方法的評論沒有發佈。我最終使用了你所建議的邏輯。非常感謝大家的幫助。 – jhc 2009-11-23 13:07:16

0

會像這樣做: (這是MSSQL2008不知道這是否會在接取工作)

創建測試數據

create table t1 
    (EmployeeId int, 
     Date1 datetime, 
     Date2 datetime, 
     date3 datetime) 

insert into t1 values (1, '2009-10-11', '2009-04-01', '2009-12-25') 
insert into t1 values (2, '2009-10-24', '2009-04-03', '2009-12-19') 

我的查詢

select case 
    when date1 > date2 and DATE1 > date3 then date1 
    when date2 > date1 and date2 > date3 then date2 
    when date3 > date1 and date3 > date2 then date3 
    end as highest 
    from t1 
+0

在Access中,您將使用IIf而不是CASE WHEN。 – Heinzi 2009-10-27 13:29:22

1
SELECT ID, Max(TheDate) AS MaxDate 
FROM 
(
    SELECT ID, Date1 AS TheDate 
    FROM myTable 
    UNION 
    SELECT ID, Date2 AS TheDate 
    FROM myTable 
    UNION 
    SELECT ID, Date3 AS TheDate 
    FROM myTable 
) 
GROUP BY ID 

我知道,這不是一個乾淨的解決方案。
但這是你在寫UNION時所要查找的內容。

編輯:你可以用UNION ALL而不是UNION。通過上面的查詢,我認爲它不會在輸出中產生影響。

+0

謝謝!這是我正在嘗試構建的查詢,但語法並沒有解決。 – jhc 2009-10-27 14:15:46

0

如果你不希望限制解決SQL,你可以用我的IMAX()函數:

Public Function iMax(ParamArray p()) As Variant 
    ' Idea from Trevor Best in Usenet MessageID [email protected] 
    Dim i As Long 
    Dim lngUBound As Long 
    Dim v As Variant 

    v = p(LBound(p)) 
    lngUBound = UBound(p) 
    For i = LBound(p) + 1 To lngUBound 
     If v < p(i) Then 
     v = p(i) 
     End If 
    Next 
    iMax = v 
    End Function 

我把它稱爲 「立即更新MAX()」 類比從IIF(),立即如果(),因爲它用於查詢中的行級處理。

0

哇!我看到這樣做太簡單了:Max(Field-Constant1,Constant2)

我的目標:根據只有一個字段計算一個值,但不要讓計算值小於常數。上的兩個場表

Expample行(關鍵字段,ValueField):

1 10 
2 5 
3 8 
4 Null 

我想選擇返回時(當CONSTANT1 = 6和CONSTANT2 = 1)中,i把整個數學澄清它(只有最後=後最頂部的右邊是我想要什麼):

1 Max(10-6,1)=Max(4,1)=4 
2 Max(5-6,1)=Max(-1,1)=1 
3 Max(8-6,1)=Max(2,1)=1 
4 Max(Null-6,1)=Max(Null,1)=Null 

,所以我只是想(當萬一CONSTANT1 = 6,CONSTANT2 = 1),它是不夠清楚:

1 4 
2 1 
3 1 
4 Null 

小心那個空。

我真的想要一些更復雜的東西,但解決方案,我將能夠解決我想要的複雜。

可以恢復爲: -return NULL,如果值爲null或不使用的數學運算符的有效值(未八方通只是一個 - 或+等) -return計算出的值,如果它是可能做數學,但限於一個範圍(不小於一個值,不大於另一個值)。

如果我這樣做對僞代碼就會像這樣:

try // try to do the maths 
    MyCalculatedValue=SomeMaths(FieldValue); 
    MyCalculatedValue=Min(Max(MyCalculatedValue,MinValue),MaxValue); 
except // In case the SomeMaths can not be done (FieldValue is Null, negative square, division by zero, etc) 
     MyCalculatedValue=Null; 
end; 
return MyCalculatedValue; 

萬一有人說數據庫不歸:我想要做一些數學的領域,然後限制的結果一個範圍;所以最小的樣本數據庫將只有一個只有兩個字段(唯一鍵字段,數據字段)的表,這是不可能完全標準化的;我不是在談論連續的某些字段的最大值,也不是一個字段上的全表(聚合函數)的最大值,只是我只想給計算值設置一個下限和一個上限,但考慮Null時這樣的值是空值或者要做的數學運算不能完成(例如Constant1 /(FieldValue-Constant2)等)。以防萬一有人

實際樣品沒有得到何時能使用:

表字段:

ID (Key) 
SpacePosition (DecimalData) 

的查詢期望的結果字段:

ID as ID 
Min(Max(SpacePosition-SomeSpaceLongitud,StartPosition),EndPosition) AS RangeStart 
Min(Max(SpacePosition+SomeSpaceLongitud,StartPosition),EndPosition) AS RangeEnd 

希望樣本清楚,並希望有人可以幫助,比使用VBA功能更容易!

P.D .:認爲這樣的數學不僅僅是+和 - 更復雜,而且表格有很多,寄存器數量多於幾個,在幾十億個寄存器附近考慮。 P.P.D .:對這種結果進行硬編碼不是一種選擇,因爲它不是標準化的數據庫,也不是最差的,這種範圍限制是用戶在運行查詢時鍵入的值。