Clause OverRides Max()的地方

时间:2014-12-15 18:39:18

标签: sql-server tsql

我正在执行此查询,但是当我抛出where子句时,它返回的不仅仅是Max()id。有没有办法仍然只返回max(),即使这个where子句?

Select ID, Max(saledate), empName, saleStatusCode
From saleDatabase
Where saleStatusCode In (1, 3, 8, 12, 14, 22)
Group By ID, empName, saleStatusCode
Order By ID Asc

对不起我不清楚的人...这里有一些示例数据

Create Table #Test
(
  ID int,
  saledate datetime,
  empName varchar(500),
  saleStatusCode int
(

INSERT INTO #TEST VALUES (1, '12/12/2014', 'Joe Joe Joe', 2)
INSERT INTO #TEST VALUES (1, '12/07/2014', 'Mitchell', 2)
INSERT INTO #TEST VALUES (1, '12/10/3014', 'Mark', 1)

Select id, Max(saledate), empName, saleStatusCode
FROM #Test
Where salestatuscode IN (1, 2, 3, 8, 122, 14, 22)
Group by id, empname, salestatuscode
Order By id asc

现在,如果你运行它,每个条目都会被返回?我需要返回的是带有max(saledate)的ID,所以我只希望返回第一条记录。

3 个答案:

答案 0 :(得分:1)

WHERE子句在GROUP BY之前和任何聚合函数之前进行评估。要在聚合后过滤,请使用HAVING子句:

Select ID, Max(saledate), empName, saleStatusCode
From saleDatabase
Group By ID, empName, saleStatusCode
Having saleStatusCode In (1, 3, 8, 12, 14, 22)
Order By ID Asc

或者使用子查询:

Select a.ID, a.Max_saledate, a.empName, a.saleStatusCode
From (
    Select ID, Max(saledate) "Max_saledate", empName, saleStatusCode
    From saleDatabase
    Group By ID, empName, saleStatusCode) a
Where saleStatusCode In (1, 3, 8, 12, 14, 22) 
Order By ID Asc

答案 1 :(得分:0)

既然您的要求已经明确,我认为这就是您所需要的:

SELECT ID, saledate, empName, saleStatusCode
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY saledate DESC) RowOrder, *
    FROM #Test
    ) SUBQ
WHERE RowOrder = 1

在您的情况下,结果是:

1   2014-12-12 00:00:00.000 Joe Joe Joe 2

实际上结果会显示Mark,因为它的日期是3014,但我猜这是一个错字。 ;)

重要编辑:

哦,John H的评论让我重新思考这一点,我发现我完全无法解决你的问题!您的请求可以像这样轻松解决:

SELECT TOP 1 *
FROM #Test
WHERE saleStatusCodeIN (1, 2, 3, 8, 122, 14, 22)
ORDER BY saledate DESC

我怎么能错过那个?

答案 2 :(得分:-2)

你的问题不明确。你只从saleDate获得MAX值?然后试试这个:

Select Max(saledate)
From saleDatabase
Where saleStatusCode In (1, 3, 8, 12, 14, 22)