SQL Сервер: удаление строк с другим агрегатом (где или с) - PullRequest
2 голосов
/ 30 января 2020

Я надеюсь показать только строки, в которых общее количество часов для идентификатора и даты сотрудника больше 10. Это будет означать агрегирование только по Идентификатору сотрудника и дате , чтобы удалите строку, но все еще показывая идентификатор проекта в результате

В Cognos это будет выглядеть примерно так: sum(Hours for Employee_ID, hoursdate) <= 10

Пример данных

Employee_ID  |  Project_ID  |  date  |  hours
A            |  98uyt       |  2/1/20|   8
A            |  76xyg       |  2/1/20|   8
B            |  76xyg       |  2/3/20|   16
C            |  98uyt       |  2/4/20|   8
C            |  98uyt       |  2/5/20|   15

В приведенном выше примере четвертая строка будет удалена, поскольку идентификатор сотрудника C всего 8 часов за 2/4/2020.

Результат:

Employee_ID  |  Project_ID  |  date  |  hours
A            |  98uyt       |  2/1/20|   8
A            |  76xyg       |  2/1/20|   8
B            |  76xyg       |  2/3/20|   1a
C            |  98uyt       |  2/5/20|   15

Вот мой код пока

SELECT        
        Employee_ID, 
        Project_ID, 
        date,
        sum(Hours)

FROM    dbo.forecast
WHERE   date > getdate()

GROUP BY Employee_ID, Project_ID, date
HAVING  sum(Hours)>= 10

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Используйте то, что у вас есть в качестве фильтра, затем выберите все на основе этого фильтра. Вот пример использования CTE для фильтра:

; WITH OverTime
AS (
    SELECT        
            Employee_ID, 
            date,
            sum(Hours)
    FROM    dbo.forecast
    WHERE   date > getdate()
    GROUP BY Employee_ID, date
    HAVING  sum(Hours)>= 10
    )
SELECT
        Employee_ID, 
        Project_ID, 
        date,
        Hours
FROM    dbo.forecast f
    INNER JOIN OverTime ot
        ON f.Employee_ID = ot.Employee_ID
        AND f.[date] = ot.[date]
    ;
1 голос
/ 30 января 2020

Вот забавный вариант использования WITH TIES

Пример

Select top 1 with ties *
 From  YourTable
 Order By case when sum(hours) over (partition by [Employee_ID],Date) >=10 then 1 else 2 end

Возвращает

Employee_ID Project_ID  date        hours
A           98uyt       2020-02-01  8
A           76xyg       2020-02-01  8
B           76xyg       2020-02-03  16
C           98uyt       2020-02-05  15
...