我在对表格进行规范化方面犯了一些错误。现在我的桌子看起来像这样:
ID Date1 Date2 Date 3
----------------------------------------------
1 2014-01-02 2015-01-02
2 2014-01-02 2015-01-03
...
我认为我可以在查询中使用IIF
函数,并且可以比较那些日期并返回最小值。问题是,有返回的NULL值使该函数一文不值。
所以我的问题是:由于NULL值,如何在查询中返回三个中的最小值而不出现错误结果?
答案 0 :(得分:1)
SQL Min
聚合函数将为您提供所需的内容,但首先必须将这些日期值放入一列中。为此,请使用UNION
查询。
SELECT sub.ID, Min(sub.Date_field) AS MinOfDate_field
FROM
(
SELECT y1.ID, y1.Date1 AS Date_field
FROM [YourTable] AS y1
UNION ALL
SELECT y2.ID, y2.Date2 AS Date_field
FROM [YourTable] AS y2
UNION ALL
SELECT y3.ID, y3.Date3 AS Date_field
FROM [YourTable] AS y3
) AS sub
GROUP BY sub.ID;
如果最终查询中还需要其他YourTable
字段,请将INNER JOIN
该查询添加到表中。
答案 1 :(得分:0)
您可以使用Iif
,但您也必须注意NULL值。
因此,使用Date1
代替Nz(Date1, CDate("31.12.9999"))
,以此类推。
或者,您可以在查询中使用以下MinDate
过程:
SELECT MinDate([Date1],[Date2],[Date3]) AS MinDate FROM Table1
Public Function MinDate(ParamArray values() As Variant) As Date
Dim value As Variant
For Each value In values: Do
If VarType(value) <> vbDate Then Exit Do
If CLng(MinDate) = 0 Then
MinDate = value
Else
If value < MinDate Then MinDate = value
End If
Loop While False: Next value
End Function
但是两种方法肯定都能闻到... 您应该考虑重新设计。