从列的最大值查找结束日期的ORacle SQL查询
e、 g。 我的表包含如下所示的记录从列的最大值查找结束日期的ORacle SQL查询,sql,oracle,Sql,Oracle,e、 g。 我的表包含如下所示的记录 EmpName Paycode ApplyDate Amt. of Hrs emp1 vacation 5/1/2010 8 emp1 vacation 5/2/2010 8 emp1 vacation 5/3/2010
EmpName Paycode ApplyDate Amt. of Hrs
emp1 vacation 5/1/2010 8
emp1 vacation 5/2/2010 8
emp1 vacation 5/3/2010 8
我试图得到这样的输出
Emp Name Paycode Leave Start Date Leave End Date TotalHrs
emp1 vacation 5/1/2010 5/3/2010 24
有人能帮我修一下吗
谢谢
Mart如果您希望获得更复杂的数据,并且只累计连续的天数(如@Dan在评论中提到的),那么您将需要一个更复杂的查询 下面显示了一些可能解决您问题的方法。这是对源代码的修改
如果您希望拥有更复杂的数据,并且只累计连续的天数(如@Dan在评论中提到的),那么您将需要一个更复杂的查询 下面显示了一些可能解决您问题的方法。这是对源代码的修改
根据您的表格,一名员工可能有多个相同工资代码的条目,例如“emp1有2组假期”。您的应用程序是否支持这种可能性?如果您的测试数据对同一员工和薪资代码有另一个条目,但申请日期为2010年7月5日(例如,另一个假期),那么应该如何报告?我认为您的报告只希望将连续工作日分组到同一个聚合报告行中。@同样,是的,您是正确的。。一个emp可以包含多组记录。这类似于如果您在5月休假一周,在8月休假另一周,如果用户想查看您全年的假期历史记录,显然您的所有假期都应该作为输出。@Dan说另一个例子……如果emp2的假期期限为2010年7月5日至2010年7月9日,那么我的输出应该是emp2 |假期| 2010年7月5日| 2010年7月9日| 40根据您的表格,似乎一名员工可能有多个相同工资代码的条目,例如“emp1有两组假期”。您的应用程序是否支持这种可能性?如果您的测试数据对同一员工和薪资代码有另一个条目,但申请日期为2010年7月5日(例如,另一个假期),那么应该如何报告?我认为您的报告只希望将连续工作日分组到同一个聚合报告行中。@同样,是的,您是正确的。。一个emp可以包含多组记录。这类似于如果您在5月休假一周,在8月休假另一周,如果用户想查看您全年的假期历史记录,显然您的所有假期都应该作为输出。@Dan说另一个例子,例如……如果emp2的假期期限为2010年7月5日至2010年7月9日,那么我的输出应该是emp2 |休假| 7/5/2010 | 7/9/2010 |40@MikeyByCrikey...do除了上面的代码,我还需要更多的代码块吗?上述代码不返回任何行。谢谢你的努力。@Mahadevan:这些应该都能用,不需要额外的钱。在10.2.0.4中为我返回三行。你有什么错误吗?@Mahadevan我刚改成评论格式。可能会更好。从IE复制出来的一行代码导致了问题。不过Firefox没有问题。。。奇怪。@MikeyByCrikey:如果我想对整个表运行'with'子句定义,我需要保留它吗?@Madadevan:删除
with
子句,因为它只是提供一些示例数据。用表名替换test\u数据
。然后从查询的最低子查询开始,看看从那里得到了什么。追踪问题。当查询为我工作时,我真的无法帮助调试它,而且除了说它不返回行之外,我没有从您那里得到太多信息。@MikeyByCrikey…除了上面的代码之外,我还需要更多的代码块吗?上述代码不返回任何行。谢谢你的努力。@Mahadevan:这些应该都能用,不需要额外的钱。在10.2.0.4中为我返回三行。你有什么错误吗?@Mahadevan我刚改成评论格式。可能会更好。从IE复制出来的一行代码导致了问题。不过Firefox没有问题。。。奇怪。@MikeyByCrikey:如果我想对整个表运行'with'子句定义,我需要保留它吗?@Madadevan:删除with
子句,因为它只是提供一些示例数据。用表名替换test\u数据
。然后从查询的最低子查询开始,看看从那里得到了什么。追踪问题。当查询对我起作用时,我真的无法帮助调试它,并且除了说它不返回行之外,我没有从您那里获得太多信息。这将“跳转”多个假期中的间隔。这将“跳转”多个假期中的间隔。
select
empname
, paycode
, min(applyDate) as leave_start_date
, max(applyDate) as leave_end_date
, sum(amt_of_hrs) as total_hours
from TableEmp
group by empname, paycode
WITH test_data AS (
SELECT 'emp1' as empname, 'vacation' as paycode, date '2010-05-01' as applydate, 8 as numhours from dual union all
SELECT 'emp1' as empname, 'vacation' as paycode, date '2010-05-02' as applydate, 8 as numhours from dual union all
SELECT 'emp1' as empname, 'vacation' as paycode, date '2010-05-03' as applydate, 8 as numhours from dual union all
SELECT 'emp2' as empname, 'vacation' as paycode, date '2010-05-01' as applydate, 8 as numhours from dual union all
SELECT 'emp2' as empname, 'vacation' as paycode, date '2010-05-02' as applydate, 8 as numhours from dual union all
SELECT 'emp1' as empname, 'vacation' as paycode, date '2010-07-05' as applydate, 8 as numhours from dual
)
select
empname,
paycode,
min(applydate) as startdate,
max(applydate) as startdate,
sum(numhours) as toalhours
from (
select
empname,
paycode,
applydate,
numhours,
/* number the blocks sequentially */
sum(is_block_start) over (partition by empname, paycode order by applydate) as block_num
from (
select
empname,
paycode,
applydate,
numhours,
/* Mark the start of each block */
case
when applydate = prev_applydate + 1 then 0 else 1 end as is_block_start
from (
select
empname,
paycode,
applydate,
numhours,
lag(applydate) over (partition by empname, paycode order by applydate) prev_applydate
from test_data
)
)
)
group by empname, paycode, block_num