SQL присоединиться к себе получить вторую строку с первым и без дубликатов - PullRequest
0 голосов
/ 07 июля 2011

Привет. Попытка получить чистый результат самостоятельного объединения в SQL

Вот SQL:

SELECT DISTINCT(a.EVENTDATE)'Date',
                a.PERSONFULLNAME'Employee',
                a.STARTDTM'ShiftStart', 
                a.OUTPUNCHDTM'BreakStart',
                b.STARTDTM 'BreakEnd',
                b.OUTPUNCHDTM 'ShiftEnd' 
FROM vp_timesheetpunch a 
LEFT OUTER JOIN vp_timesheetpunch b ON 
                a.EVENTDATE=b.EVENTDATE AND 
                a.STARTDTM <> b.STARTDTM AND 
                a.PERSONNUM=b.PERSONNUM AND 
                a.STARTDTM < b.STARTDTM 
WHERE a.PERSONNUM='104739' 
GROUP BY a.EVENTDATE, 
         a.PERSONFULLNAME, 
         a.STARTDTM, 
         b.STARTDTM, 
         a.OUTPUNCHDTM, 
         b.OUTPUNCHDTM
ORDER BY a.EVENTDATE

РЕЗУЛЬТАТ (2 записи в дни с записанными перерывами *):

2011-06-24  LAST, F  2011-06-24 07:30  2011-06-24 14:00  2011-06-24 15:00  2011-06-24 20:36 
2011-06-24 00:00  LAST, F  2011-06-24 15:00  2011-06-24 20:36  NULL  NULL

* Мне нужно подавить второй результат в любой день

Ответы [ 2 ]

0 голосов
/ 07 июля 2011

Если для каждого сотрудника и даты есть только максимум две строки:

SELECT a.EVENTDATE      'Date',
       a.PERSONFULLNAME 'Employee',
       a.STARTDTM       'ShiftStart', 
       a.OUTPUNCHDTM    'BreakStart',
       b.STARTDTM       'BreakEnd',
       b.OUTPUNCHDTM    'ShiftEnd' 
FROM 
    ( SELECT EVENTDATE,
             PERSONNUM,       
             PERSONFULLNAME, 
             MIN(STARTDTM)    AS STARTDTM,       
             MIN(OUTPUNCHDTM) AS OUTPUNCHDTM  
      FROM vp_timesheetpunch
      WHERE PERSONNUM = '104739' 
      GROUP BY EVENTDATE, 
               PERSONNUM, 
               PERSONFULLNAME
    ) AS a
LEFT OUTER JOIN vp_timesheetpunch b ON 
                a.EVENTDATE = b.EVENTDATE AND 
                a.PERSONNUM = b.PERSONNUM AND 
                a.STARTDTM  < b.STARTDTM 
ORDER BY a.EVENTDATE
0 голосов
/ 07 июля 2011

@ X-Zero имеет точку - запрос возвращает два столбца для BreakStart и BreakEnd, поэтому, если сотрудник сделал ДВА перерыва, просто невозможно показать значимые результаты.

Если предположить, что сотрудники берут 0 или 1 перерыв в день, это, вероятно, даст вам то, что вы просили:

-- This part gets data for everyone that took a break.
-- Hopefully they took only ONE break
-- (if they took more, we'll get multiple rows here)
Select A.EventDate      'Date'
      ,A.PersonFullName 'Employee'
      ,A.StartDtm       'ShiftStart'
      ,A.OutPunchDtm    'BreakStart'
      ,B.StartDtm       'BreakEnd'
      ,B.OutPunchDtm    'ShiftEnd'
  From vp_TimeSheetPunch A
  Join vp_TimeSheetPunch B On A.EventDate=B.EventDate
                         And A.PersonNum=B.PersonNum
                         And A.StartDtm<B.StartDtm
Union
-- This part gets data for everyone that did not take a break.
Select C.EventDate      'Date'
      ,C.PersonFullName 'Employee'
      ,C.StartDtm       'ShiftStart'
      ,Null             'BreakStart'
      ,Null             'BreakEnd'
      ,C.OutPunchDtm    'ShiftEnd'
  From vp_TimeSheetPunch C
 Where Not Exists(Select *
                    From vp_timesheetpunch D
                   Where C.EventDate=D.EventDate
                     And C.PersonNum=D.PersonNum
                     And C.StartDtm<>D.StartDtm)

-- This orders the result using column numbers
Order By 1,2,3,4

Это должно сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...