2009-10-27 50 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 .:对这种结果进行硬编码不是一种选择,因为它不是标准化的数据库,也不是最差的,这种范围限制是用户在运行查询时键入的值。