迭代列以查找具有最后一个非零值的列

我有如下表work_sheet,

 -----------------------------------------------
 Pid WeekendDate星期一星期二星期三星期五星期五星期六星期日
 ----------------------------------------------
 11 14.10.2012 4 4 5 1 0 0 0
 11 07.10.2012 2 2 1 5 3 0 0
 12 07.10.2012 2 2 0 0 0 0 0

在这里,WeekendDate是“Sun”(最后一列)

我需要在logging最后一个非零值时find每个Pid的date。 所以我的结果应该是这样的

 Pid LastValueDate
 11 11.10.2012
 12 02.10.2012

 11  - > 11.10.2012是Thr(值1)
 12  - > 02.10.2012是星期二(值2)

由于我的数据是在Excel中,我正在使用JDBC-ODBC连接。 我宁愿我们这可以用SQL来实现。

我的不完整的解决scheme(需要findlast_effort_day ):

selectpid
       ,max(WeekendDate) - (6- last_effort_day )AS end_date
 从努力工作表
 GROUP BY pid

请帮忙。

Try this select es.p_id,es.weekenddate-( CASE WHEN SUN != 0 THEN 0 WHEN SAT != 0 THEN 1 WHEN FRI != 0 THEN 2 WHEN THR != 0 THEN 3 WHEN WED != 0 THEN 4 WHEN TUE != 0 THEN 5 ELSE 6 END ) from( select p_id,max(weekenddate)dt from effort_sheet group by p_id )inner,effort_sheet es where inner.p_id =es.p_id AND inner.dt=es.weekenddate; 

sqlfiddle链接

 SELECT PID, Dateadd(DAY, -1 * ( CASE WHEN SUN != 0 THEN 0 WHEN SAT != 0 THEN 1 WHEN FRI != 0 THEN 2 WHEN THR != 0 THEN 3 WHEN WED != 0 THEN 4 WHEN TUE != 0 THEN 5 ELSE 6 END ), WEEKENDDATE) AS end_date FROM EFFORT_SHEET GROUP BY PID 
 SELECT Pid, MAX(WeekendDate) - (8 - MIN(CHARINDEX('0', CAST(Mon AS nvarchar(10) + CAST(Tue AS nvarchar(10)) + CAST(Wed AS nvarchar(10)) + CAST(Thr AS nvarchar(10)) + CAST(Fri AS nvarchar(10)) + CAST(Sat AS nvarchar(10)) + CAST(Sun AS nvarchar(10))))) AS last_effort_day FROM effort_sheet GROUP BY pid 

我会开始使用这个联合查询,这是更容易操纵:

  Select Pid, WeekendDate-6 As WeekDate, Mon As Num From effort_sheet Union Select Pid, WeekendDate-5 As WeekDate, Tue As Num From effort_sheet Union Select Pid, WeekendDate-4 As WeekDate, Wed As Num From effort_sheet 

等等,每周的每一天。 那么你可以通过查询来使用一个组:

  Select Pid, Max(WeekDate) From (the union select above) Where Num>0 Group By Pid 

这是标准的SQL,应该与任何DBMS一起工作。

尝试这个:

 select pid, max(case when mon = 0 then weekenddate - 7 when mon != 0 and tue = 0 then weekenddate - 6 when tue != 0 and wed = 0 then weekenddate - 5 when wed != 0 and thr = 0 then weekenddate - 4 when thr != 0 and fri = 0 then weekenddate - 3 when fri != 0 and sat = 0 then weekenddate - 2 when sat != 0 and sun = 0 then weekenddate -1 end) from effort_sheet group by pid