2014-09-19 30 views
1

我已经在SQL Server中下面的查询显示多个最大列:如何从最大ID

select 
    Max(STO.LeaveID) as LeaveID, 
    LR.EmployeeName, 
    STO.DateOff, 
    STO.TimeBegin, 
    STO.TimeEnd, 
    STO.PayPeriodEnd, 
    STO.TodayHoursOff, 
    STO.LeaveCode 
from 
    dbo.tblSeperateTimeOff STO 
inner join 
    dbo.tblLeaveRequest LR on STO.LeaveID=LR.ID 
inner join 
    dbo.tblLeaveApproval LA on STO.LeaveID = LA.LeaveID 
where 
    LA.ApprovalDepartment like'%Finance%' 
    and EmployeeName like '%polland%' 
    and LA.IsApprove=1 
    and LA.IsFinalApprove=1 
group by 
    LR.EmployeeName, 
    STO.DateOff, 
    STO.TimeBegin, 
    STO.TimeEnd, 
    STO.PayPeriodEnd, 
    STO.TodayHoursOff, 
    STO.LeaveCode 
order by 
    EmployeeName 

结果显示:

LeaveID EmployeeName DateOff  TimeBegin TimeEnd  PayPeriod Hours LeaveCode 
88  Polland, Sean 2014-09-08 08:30AM  11:00AM  2014-09-13 2.5  P (Personal Leave Scheduled*) 
112  Polland, Sean 2014-09-24       2014-09-27 8  P (Personal Leave Scheduled*) 
121  Polland, Sean 2014-09-25       2014-09-27 8  P (Personal Leave Scheduled*) 
121  Polland, Sean 2014-09-26       2014-09-27 8  P (Personal Leave Scheduled*) 

我想获得与摆脱行LeaveID 112并保留88和两个121的LeaveID。原因是我希望它只有最大的Leave ID具有相同的PayPeriod。我将如何格式化查询以实现此目的?谢谢。

+0

如果你知道你想消灭你能不能只是添加一个附加条件和'LEAVEID NOT IN(112)许可ID' – MethodMan 2014-09-19 18:01:11

+0

你真应该看看正常化您的数据。您将EmployeeName作为格式化值存储在每一行中。您还要存储LeaveCode的文本。这两个应该是另一个表的外键。与ApprovalDepartment一样。 – 2014-09-19 18:02:42

+0

DJ Kraze:我正在使用这个例子,所以我在这种情况下声明了EmployeeName。实际上,对于ApprovalDepartment,IsApprove和IsFinalApprove,只有where子句将有100行。另一位员工可以在相同的付款期限内请求日期,但是LeaveID与这种情况类似。我只是不希望在这个例子中使用LeaveID 112,而不必像上面提到的那样使用静态条件。 – JonL 2014-09-19 18:08:35

回答

1

这里是你可以做到这一点的方法之一。

create table #Something 
(
    LeaveID int 
    , EmployeeName varchar(25) 
    , DateOff date 
    , TimeBegin time 
    , TimeEnd time 
    , PayPeriod date 
    , Hours numeric(9,2) 
    , LeaveCode varchar(50) 
) 

insert #Something 
select 88, 'Polland, Sean', '2014-09-08', '08:30AM', '11:00AM', '2014-09-13', 2.5, 'P (Personal Leave Scheduled*)' union all 
select 112, 'Polland, Sean', '2014-09-24', null, null, '2014-09-27', 8, 'P (Personal Leave Scheduled*)' union all 
select 121, 'Polland, Sean', '2014-09-25', null, null, '2014-09-27', 8, 'P (Personal Leave Scheduled*)' union all 
select 121, 'Polland, Sean', '2014-09-26', null, null, '2014-09-27', 8, 'P (Personal Leave Scheduled*)'; 

with SortedResults as 
(
    select * 
    , DENSE_RANK() over(partition by PayPeriod order by LeaveID desc) as GroupDepth 
    from #Something 
) 

select * 
from SortedResults 
where GroupDepth = 1 

drop table #Something 
+0

这似乎也是一个看法。 – JonL 2014-09-19 19:44:53

0

的解决方案是运行一个子查询选择每个PayPeriodEmployeeName,然后inner join针对最大LeaveID过滤掉其他的叶子。

1

您可以使用相关子查询来筛选每个id的最大值。尝试添加这对您的内部连接:

inner join 
    (
    select max(LeaveID) maxleaveid , PayPeriodEnd 
    from tblSeperateTimeOff 
    group by PayPeriodEnd 
) m on sto.leaveid = m.maxleaveid and sto.PayPeriodEnd = m.PayPeriodEnd 

我觉得这是你所需要的:

select 
    Max(STO.LeaveID) as LeaveID, 
    LR.EmployeeName, 
    STO.DateOff, 
    STO.TimeBegin, 
    STO.TimeEnd, 
    STO.PayPeriodEnd, 
    STO.TodayHoursOff, 
    STO.LeaveCode 
from dbo.tblSeperateTimeOff STO 
inner join dbo.tblLeaveRequest LR on STO.LeaveID=LR.ID 
inner join dbo.tblLeaveApproval LA on STO.LeaveID = LA.LeaveID 
inner join 
    (
    select max(LeaveID) maxleaveid , PayPeriodEnd 
    from tblSeperateTimeOff 
    group by PayPeriodEnd 
) m on sto.leaveid = m.maxleaveid and sto.PayPeriodEnd = m.PayPeriodEnd 
where 
    LA.ApprovalDepartment like'%Finance%' 
    and EmployeeName like '%polland%' 
    and LA.IsApprove=1 
    and LA.IsFinalApprove=1 
group by 
    LR.EmployeeName, 
    STO.DateOff, 
    STO.TimeBegin, 
    STO.TimeEnd, 
    STO.PayPeriodEnd, 
    STO.TodayHoursOff, 
    STO.LeaveCode 
order by EmployeeName 
+0

你的意思是我有两个内部连接吗?你将如何格式化它? – JonL 2014-09-19 18:38:05

+0

@JonL我的意思是你应该像对待其他连接一样对待它,并把代码片段放在其他连接之后 – jpw 2014-09-19 18:42:36

+0

我已经在其他两个内部连接之后并在末尾的where子句之前添加了内部连接块,并且它仍然返回其中有LeaveID 112。 – JonL 2014-09-19 18:49:19