当存在多条记录时,如何使用MIN和MAX选择记录?

时间:2014-06-05 20:11:51

标签: sql sql-server sql-server-2008

我有两个SQL Server表。第一个表是一个客户表,其中包含客户编号,名称等。第二个表包含客户的服务日期。客户可以有多个服务日期。以下是服务日期表的示例:

custnmbr     DateIn       DateOut
------------------------------------    
78001       1991-02-10    2001-12-07
78001       2002-08-03    2003-06-17  
78001       2006-11-22    NULL   

我想选择最早的DateIn和最近的DateOut。在上面的例子中,我想将DateIn作为1991-02-10返回,并且由于客户当前处于活动状态,我希望将DateOut返回为NULL。

这是我尝试过的,但没有运气

SELECT  
    SM.Custnmbr, 
    CONVERT (VARCHAR(10), MAX(LH.DateIn), 101) AS DateIn, 
    CONVERT (VARCHAR(10), MAX(LH.DateOut), 101) AS DateOut, 
FROM    
    dbo.toCustomer SM
LEFT OUTER JOIN 
    dbo.toLocCustHist LH ON SM.CustomerId = LH.CustomerId
GROUP BY    
    SM.CustNmbr, SM.CustName, LH.LocationId

当我运行查询时,DateIn在1991-02-10中是正确的,但DateOut有2003-06-17,这是错误的。

3 个答案:

答案 0 :(得分:2)

在汇总函数中不考虑

NULL值,因此您需要将NULL设置为其他值,并且您不应该在{{1}中添加额外元素声明:

GROUP BY

答案 1 :(得分:0)

SQL并不认为NULL日期大于2003-06-17。你需要用一个远期的占位符日期替换NULL,以便MAX()选择它。

SELECT  SM.Custnmbr, 
CONVERT (VARCHAR(10), MAX(LH.DateIn), 101) AS DateIn, 
CONVERT (VARCHAR(10), MAX(ISNULL(LH.DateOut,'99991231'), 101) AS DateOut, 
FROM    dbo.toCustomer SM
LEFT OUTER JOIN dbo.toLocCustHist LH ON SM.CustomerId = LH.CustomerId
GROUP BY    SM.CustNmbr, SM.CustName, LH.LocationId

如果要显示当前日期(即GETDATE())而不是9999-12-31,则可以使用CASE语句。

答案 2 :(得分:0)

WITH TEMP AS
(
SELECT  SM.Custnmbr AS Custnmbr, 
CONVERT (VARCHAR(10), MIN(LH.DateIn), 101) AS DateIn, 
CONVERT (VARCHAR(10), MAX(ISNULL(LH.DateOut,'9999-12-12')), 101) AS DateOut, 
FROM    dbo.toCustomer SM
LEFT OUTER JOIN dbo.toLocCustHist LH ON SM.CustomerId = LH.CustomerId
GROUP BY    SM.CustNmbr, SM.CustName, LH.LocationId
)
SELECT Custnmbr,DateIn,
CASE WHEN DateOut='9999-12-12' THEN NULL
ELSE DateOut
END
FROM TEMP;