我正在执行此查询,但是当我抛出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,所以我只希望返回第一条记录。
答案 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)