Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何显示max ID中的多个max列_C#_Sql_Asp.net_Sql Server - Fatal编程技术网

C# 如何显示max ID中的多个max列

C# 如何显示max ID中的多个max列,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,我在SQL Server中有以下查询: 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 j

我在SQL Server中有以下查询:

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。这样做的原因是,我希望它仅从最大休假ID具有相同的支付期。我将如何格式化查询以实现这一点?谢谢。

解决方案是运行一个子查询,为每个
工资期
员工姓名
选择最大
LeaveID
,然后根据该查询选择
内部联接
,过滤掉其他假期

可以使用相关子查询筛选每个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

这里有一种方法可以做到这一点

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

如果您知道要删除的LEAVEID,那么您可以不添加一个附加条件,并且
LEAVEID不在(112)
中,您确实应该考虑规范化您的数据。您正在将EmployeeName作为格式化值存储在每一行中。此外,您正在存储代码的文本。这两个表都应该是另一个表的外键。ApprovalDepartment.DJ Kraze的情况也一样:我以ApprovalDepartment.DJ Kraze为例,所以我在这个场景中声明EmployeeName。实际上,将有100个行,其中只有where子句用于ApprovalDepartment、IsApprove和IsFinalApprove。另一名员工可以请求相同工资期的日期,但LeaveID与此情况类似。在这个例子中,我只是不希望LeaveID 112不需要像你提到的那样使用静态条件,你是说在我的两个内部连接上?你将如何格式化它?@JonL我的意思是你应该像对待其他连接一样对待它,只把代码片段放在其他连接之后。我已经在其他两个内部连接之后和结尾的where子句之前添加了内部连接块,它仍然返回一行,其中有LeaveID 112。@JonL哦,我想我的大脑在周末早些时候休假了。。。我在错误的属性上聚合和分组。当然,它应该是由max(LeaveID)完成的。我用一个应该正确的查询更新了答案。这是一个很好的尝试。dateoff按组进行分组,以获取特定期间员工的不同日期。你的新查询删除了groupby,并且Max(STO.LeaveID)给我留下了两行LeaveID 112,而不是删除它。这两行LeaveID 112在同一个发薪期内,我不需要它。