2013-09-25 1 views
1

У меня есть таблица с ежедневными суммами сотрудников с датой начала, мне нужно оглянуться на 3 месяца, чтобы узнать, сколько дней работал сотрудник.SQL 2008 - Мне нужно подсчитать количество строк на одного сотрудника за данный период времени

Вот мой SQL-запрос:

SELECT 
    EMPNO, 
    CONVERT(VARCHAR(10), STARTDATE,101), 
    ROW_NUMBER() OVER (ORDER BY PERSONNUM) AS 'ROWCOUNT' 
    FROM EMPLOYEE 
    WHERE STARTDATE BETWENN DATEADD(month, -3, GETDATE()) and GETDATE() 
    GROUP BY EMPNO,STARTDATE 
    ORDER BY EMPNO 

Результат

EMPNO  STARTDATE    ROWCOUNT 
    TEST108 09/13/2013    1 
    TEST108 09/16/2013    2 
    TEST108 09/17/2013    3 
    TEST108 09/19/2013    4 
    TEST109 09/04/2013    5 
    TEST109 09/05/2013    6 
    TEST109 09/06/2013    7 
    TEST110 09/03/2013    9 
    TEST110 09/04/2013    10 
    TEST110 09/05/2013    11 

Желаемая Result

EMPNO   ROWCOUNT 
    TEST108   4 
    TEST109   3 
    TEST110   3 

Спасибо,

+0

Может ли быть несколько строк для одного сотрудника с тем же STARTDATE, или почему вы группируете EMPNO, STARTDATE? – cdoubleplusgood

ответ

1

Вы можете использовать этот КТР с ROW_NUMBER и COUNT(*)OVER:

WITH CTE AS 
(
    SELECT EMPNO, STARTDATE, 
      RN = ROW_NUMBER() OVER (PARTITION BY EMPNO ORDER BY STARTDATE DESC), 
      [ROWCOUNT] = COUNT(*) OVER (PARTITION BY EMPNO) 
    FROM dbo.EMPLOYEE 
    WHERE STARTDATE BETWEEN DATEADD(month, -3, GETDATE()) and GETDATE() 
) 
SELECT EMPNO, STARTDATE, [ROWCOUNT] 
FROM CTE 
WHERE RN = 1 

DEMO

ROW_NUMBER В возвращает номер для каждой строки в partiton (по аналогии с GROUP BY EMPNO) и позволяет выбрать все столбцы без необходимости объединить все. COUNT(*)OVER возвращает общее количество строк для каждого раздела, так что вы хотите. Я использую ROW_NUMBER, чтобы удалить дубликаты.

1

Не можете использовать счетчик?

SELECT EMPNO, COUNT(EMPNO) AS [ROWCOUNT] 
FROM EMPLOYEE 
WHERE STARTDATE BETWEEN DATEADD(month, -3, GETDATE()) and GETDATE() 
GROUP BY EMPNO 
ORDER BY EMPNO 
1

Попробуйте один -

SELECT EMPNO 
    , [ROWCOUNT] = COUNT(1) 
FROM dbo.Employee 
WHERE StartDate BETWEEN DATEADD(MONTH, -3, GETDATE()) AND GETDATE() 
GROUP BY EMPNO 
ORDER BY EMPNO --[ROWCOUNT] DESC 
1

Попробуйте

SELECT 
EMPNO,COUNT(STARTDATE) 
FROM EMPLOYEE 
WHERE STARTDATE BETWEEN DATEADD(month, -3, GETDATE()) and GETDATE() 
GROUP BY EMPNO 
ORDER BY EMPNO 
+0

У вас есть опечатка в выборе: «Betwenn» - в противном случае я согласен с этим решением. –

+0

Спасибо .. Обновлен ответ. – dcp1986

Смежные вопросы