SQL:使用Max函数并返回每个客户端的最大值,而不是整体

时间:2013-09-04 19:15:49

标签: sql sql-server

我是使用SQL的新手,我正在尝试构建我的第一个查询/报告,并希望我能得到一些帮助(这似乎是它的地方!)。基本上我想要创建的是一份报告,显示员工或承包商上次付款的时间。我们有一个包含所有这些信息的数据库,我只想返回每个人的最后一个付款日期的清单。我最终得到的是我们已经支付的每笔工资的清单(Person1在每个支付日期的列表中超过20次),或者包含每个人的列表以及任何人的最新支付日期,而不仅仅是那个人。以下是我到目前为止的情况:

SELECT  table1.Office ,
    table1.EE_No ,
    table1.Name ,
    table1.Code ,
    table1.Freq ,
    ( SELECT DISTINCT
                MAX(table2.PayDate)
      FROM      table2
    ) AS Last_Paycheck
FROM    table1
    INNER JOIN table2 ON table1.UniqueID = table2.UniqueID
WHERE   table1.EndDate IS NULL

这将返回列出的所有员工列表,其中列出了8/30/2013,这是最后一次有人获得报酬但不是每个人。我在Max功能上做错了什么?我尝试了很多不同的方法而没有运气,一定要错过这里明显的东西!

3 个答案:

答案 0 :(得分:0)

您需要尝试类似

的内容
Select table1.Office, 
table1.EE_No, 
table1.Name, 
table1.Code, 
table1.Freq, 
(Select distinct MAX (table2.PayDate) 
from table2
where table1.UniqueID = table2.UniqueID
) as Last_Paycheck

from
table1 on 
where 
table1.EndDate is null

另一种方式是

Select table1.Office, 
table1.EE_No, 
table1.Name, 
table1.Code, 
table1.Freq, 
MAX (table2.PayDate) as Last_Paycheck

from
table1 inner join
table2
on table1.UniqueID = table2.UniqueID
where 
table1.EndDate is null
GROUP BY table1.Office, 
table1.EE_No, 
table1.Name, 
table1.Code, 
table1.Freq

另请注意,评论指出,使用更具描述性的表名,因为这将在以后大大提高可保性。

答案 1 :(得分:0)

尝试更改此行:

(Select distinct MAX (table2.PayDate) from table2) as Last_Paycheck

对于这样的事情:

MAX (table2.PayDate) OVER (PARTITON BY table2.UniqueID) as Last_Paycheck

不需要Select - 您已经说明了加入条款中所需的关联。

希望这可以解决问题......

答案 2 :(得分:0)

使用分组:

Select table1.Office, 
table1.EE_No, 
table1.Name, 
table1.Code, 
table1.Freq, 
MAX (table2.PayDate) as Last_Paycheck
from table1 
inner join table2
on table1.UniqueID = table2.UniqueID
where table1.EndDate is null
group by table1.Office, 
table1.EE_No, 
table1.Name, 
table1.Code, 
table1.Freq