Sql ACCESS 2007:确定跨多列的每行最大值
我有一个表,每个员工有多个日期列:Sql ACCESS 2007:确定跨多列的每行最大值,sql,ms-access-2007,Sql,Ms Access 2007,我有一个表,每个员工有多个日期列: Emp 1, Date1, Date2, Date3 Emp 2, Date1, Date2, Date3 等等 我想写一个查询,返回每个员工三个可用日期中的最长日期。我知道我需要编写一个UNION ALL查询,但我似乎无法获得语法,以便获得每个员工记录的最大值。我一直为所有员工提供相同的价值。我肯定这是一个愚蠢的错误,但它让我发疯。任何帮助都将不胜感激 感谢您的及时回复!有没有办法不用iif语句就可以做到这一点?如果可能的话,我想对它进行推广
Emp 1, Date1, Date2, Date3
Emp 2, Date1, Date2, Date3
等等
我想写一个查询,返回每个员工三个可用日期中的最长日期。我知道我需要编写一个UNION ALL查询,但我似乎无法获得语法,以便获得每个员工记录的最大值。我一直为所有员工提供相同的价值。我肯定这是一个愚蠢的错误,但它让我发疯。任何帮助都将不胜感激
感谢您的及时回复!有没有办法不用iif语句就可以做到这一点?如果可能的话,我想对它进行推广,因为还有几个其他的日期字段,它在计算IIF逻辑时变得非常笨拙
另外,我忘了提到这些日期中的任何一个都可以为空,IIF逻辑似乎返回NULL作为最大值。这样做是为了: (这是MSSQLS2008,不确定它是否能在Acess中工作) 创建测试数据
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
像这样的东西可以: (这是MSSQLS2008,不确定它是否能在Acess中工作) 创建测试数据
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
像这样的东西行吗
select
EmployeeColumn,
iff(iif(Date1 > Date2, Date1, Date2) > Date3, iif(Date1 > Date2, Date1, Date2), Date3)
from yourTable
像这样的东西行吗
select
EmployeeColumn,
iff(iif(Date1 > Date2, Date1, Date2) > Date3, iif(Date1 > Date2, Date1, Date2), Date3)
from yourTable
我知道这不是一个干净的解决方案。但这正是您在撰写
UNION
时所寻找的
编辑:您可以使用UNION ALL
而不是UNION
。使用上述查询,我想它不会对输出产生影响
我知道这不是一个干净的解决方案。但这正是您在撰写
UNION
时所寻找的
编辑:您可以使用
UNION ALL
而不是UNION
。使用上述查询,我想它不会对输出产生影响。如果不想将解决方案限制为SQL,可以使用my iMax()函数:
Public Function iMax(ParamArray p()) As Variant
' Idea from Trevor Best in Usenet MessageID rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
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
公共函数iMax(ParamArray p())作为变量
“来自Trevor的创意最佳Usenet MessageIDrib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
我想我会坚持多久
朦胧而深沉
Dim v作为变体
v=p(LBound(p))
lngUBound=UBound(p)
对于i=LBound(p)+1到lngUBound
如果v
根据IIf()和Immediate If()的类比,我将其称为“Immediate Max()”,因为它用于查询中的行级处理。如果不想将解决方案限制为SQL,可以使用我的iMax()函数:
Public Function iMax(ParamArray p()) As Variant
' Idea from Trevor Best in Usenet MessageID rib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
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
公共函数iMax(ParamArray p())作为变量
“来自Trevor的创意最佳Usenet MessageIDrib5dv45ko62adf2v0d1cot4kiu5t8mbdp@4ax.com
我想我会坚持多久
朦胧而深沉
Dim v作为变体
v=p(LBound(p))
lngUBound=UBound(p)
对于i=LBound(p)+1到lngUBound
如果v
根据IIf()和Immediate If()的类比,我将其称为“Immediate Max()”,因为它用于查询中的行级处理。哇!我发现它太复杂了,无法做一个简单的:
Max(Field-Constant1,Constant2)
我的目标是:仅根据一个字段计算值,但不要让计算值小于常量
两字段表(KeyField、ValueField)上的EXPLAMP行:
我想要一个返回的select(当Constant1=6和Constant2=1时),我用整个数学来澄清它(我想要的是最后一个=之后最右上方的部分):
所以我只想(当Constant1=6和Constant2=1)以防不够清楚:
1 4
2 1
3 1
4 Null
当心那个空的
我真的想要更复杂的东西,但解决这个问题我就能解决我想要的复杂问题
它可以恢复为:
-如果值为Null或不是所用数学运算符的有效值,则返回Null(并非总是仅为a-或a+,等等)
-如果可以进行计算,则返回计算值,但仅限于一个范围(不小于一个值,不大于另一个值)
如果我在伪代码上执行此操作,它将如下所示:
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时考虑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.:这不是硬编码这样的结果的选项,因为它不会是标准化的数据库,最糟糕的是,这样的范围限制是用户在运行查询时键入的值。
哇!我发现它太复杂了,无法做一个简单的:
Max(Field-Constant1,Constant2)
我的目标是:仅根据一个字段计算值,但不要让计算值小于常量
两字段表(KeyField、ValueField)上的EXPLAMP行:
我想要一个返回的select(当Constant1=6和Constant2=1时),我用整个数学来澄清它(我想要的是最后一个=之后最右上方的部分):
所以我只想(当Constant1=6和Constant2=1)以防不够清楚:
1 4
2 1
3 1
4 Null
当心