我有两个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,这是错误的。
答案 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;