2011-11-17 57 views
0

我正在开发一个小型报告应用程序。我有两个表只抓取用户最近一次输入每天

代理表数据

AgentID AgentName 
------- --------- 
1001  ABC 
1002  XYZ 
1003  POI 
1004  JKL 

报告表数据

ReportID AgentId Labor Mandays Amount SubmitDate 
-------- ------- ----- ------- ------ ---------- 
1   1001  30  10  5000 11/12/2011 
2   1001  44  18  8000 11/14/2011 
3   1002  33  75  3022 11/12/2011 
4   1001  10  10  1500 11/14/2011 
5   1002  10  10  1800 11/14/2011 
6   1001  10  10  1400 11/14/2011 
7   1003  40  40  1500 11/14/2011 
8   1003  40  40  1800 11/14/2011 

我要生成一个报告,该报告为我们提供了输出像

ReportID AgentId Labor Mandays Amount SubmitDate 
-------- ------- ----- ------- ------ ---------- 
1   1001  30  10  5000 11/12/2011 
3   1002  33  75  3022 11/12/2011 
6   1001  10  10  1400 11/14/2011 
5   1002  10  10  1800 11/14/2011 
8   1003  40  40  1800 11/14/2011 

谢谢提前

回答

1

你没有提到什么版本的SQL Server你使用 - 如果你是2005年或更新版本,您可以使用一个CTE(公共表表达式)与ROW_NUMBER功能:

;WITH LastPerAgent AS 
(
    SELECT 
     AgentID, ReportID, Labor, Mandays, Amount, SubmitDate, 
     ROW_NUMBER() OVER(PARTITION BY AgentID,SubmitDate 
         ORDER BY ReportID DESC) AS 'RowNum' 
    FROM dbo.Report 
) 
SELECT 
    AgentID, ReportID, Labor, Mandays, Amount, SubmitDate, 
FROM LastPerAgent 
WHERE RowNum = 1 

这CTE“分区”您的数据通过AgentIDSubmitDate,并为每个分区,ROW_NUMBER功能转手出去顺序编号,从1开始,并通过ReportID DESC下令 - 这样的“最后”行(最高ReportID)为每个(AgentID, SubmitDate)对得到RowNum = 1这是我之后在SELECT语句中从CTE中选择。

PS:由于您尚未定义如何分组以及如何消除行,因此您的输入数据无法100%工作......您可能需要根据您的要求调整此查询...

+0

我没有得到我需要的结果,因为它只返回每行代理1行,我正在查找1个代理程序及其每日上次报告值。 – Moksha

相关问题