我正在使用SQL Server 2005.我有一个表格,如下所示。每个FundingID可以有多个取消。我想选择FundingCancellationReason对应每个资金的最短日期。我写了一个查询如下。这是一个SQL错误
1)你能帮我避免SQL错误吗?
2)有没有更好的逻辑来实现同样的目标?
CREATE TABLE #FundingCancellation(
[FundingCancellationID] INT IDENTITY(1,1) NOT NULL,
[FundingID] INT ,
FundingCancellationDt SMALLDATETIME ,
FundingCancellationReason VARCHAR(50)
)
SELECT FundingID,
MIN(FundingCancellationDt),
( SELECT FundingCancellationReason
FROM #FundingCancellation FC2
WHERE FC1.FundingID = FC2.FundingID
AND FC2.FundingCancellationDt = MIN(FundingCancellationDt)
) [Reason Corresponding Minimum Date]
FROM #FundingCancellation FC1
GROUP BY FundingID
- 聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。
我已经看到类似的方法在一个有点复杂的查询中工作。所以我相信tehre将是一种纠正我的查询的方法
由于 Lijo
答案 0 :(得分:0)
此查询将为每个FundingID的每个最小日期返回Reason(以及您可能需要的任何其他列):
SELECT FC1.FundingID, FC1.FundingCancellationDt,
FC1.FundingCancellationReason, FC1.OtherColumn1, FC1.Other...
FROM #FundingCancellation FC1
JOIN
(
SELECT FundingID, MIN(FundingCancellationDt) as 'MinDate'
FROM #FundingCancellation
GROUP BY FundingID
) AS Grouped ON (Grouped.FundingID = FC1.FundingID
AND (Grouped.MinDate = FC1.FundingCancellationDt
OR Grouped.MinDate IS NULL))
请注意,如果给定的FundingID具有多个具有相同FundingCancellationDt的行(并且它是最小值),则这将返回该最小日期的所有原因。
“OR Grouped.MinDate IS NULL”允许空日期。
如果您有一个FundingID的最小重复日期,并且您仍然只想要每个最小值的一个原因,那么请使用:
SELECT FundingID, MinDate,
(SELECT TOP 1 FundingCancellationReason
FROM #FundingCancellation
WHERE FundingCancellationDt = Grouped.MinDate) as 'Reason'
FROM
(
SELECT FundingID, MIN(FundingCancellationDt) as 'MinDate'
FROM #FundingCancellation
GROUP BY FundingID
) AS Grouped