Получение основной (основной), вторичной и третичной функции для эмолия - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть следующий запрос для получения основной (основной) и вторичной функции для каждого сотрудника:

with

    employeeScopeFunctions as (

        select      e.employeeId, 
                    es.FunctionId,
                    ef.Label,
                    c.CompanyName,


                    realOrder = row_number() over(
                        partition by e.employeeId
                        order by isnull(es.sortOrder, 9999)
                    )

        from        employee e 
        LEFT JOIN       employee_scope es on es.employeeId = e.employeeId
        LEFT JOIN         employee_function ef on es.FunctionId = ef.FunctionId
        LEFT JOIN         Company c ON es.CompanyId = c.ID
        WHERE e.EmployeeId=54

)

select      *,
            primacy = iif(realOrder = 1, 'main', 'secondary')
from        employeeScopeFunctions

Для EmployeeId = 54 результат выглядит следующим образом:

EmployeeId FunctionId Label                                  CompanyName realOrder Primacy
54         273        Group Chief Executive Officer          C1          1         primary
54         273        Group Chief Executive Officer          C2          2         secondary
54         273        Group Chief Executive Officer          X5          3         secondary
54         897        Group Regional Chief Executive Officer X6          4         secondary
54         897        Group Regional Chief Executive Officer F6          5         secondary
54         39         Director                               VY          6         secondary
54         39         Director                               G7          7         secondary

Что я хочу получить, так это перегруппировать все компании для выполнения определенной функции и получить три уровня первенства:

EmployeeId FunctionId Label                                  CompanyName  Primacy
54         273        Group Chief Executive Officer          C1,C2,X5     primary
54         897        Group Regional Chief Executive Officer X6,F6        secondary
54         39         Director                               VY,G7        tertiary

1 Ответ

1 голос
/ 29 сентября 2019

Если бы я следил за вами правильно, вы могли бы сохранить существующий CTE и включить агрегирование в основном запросе.ROW_NUMBER() можно использовать для ранжирования записей путем увеличения realOrder.

. Это должно работать в SQL-сервере:

WITH employeeScopeFunctions as (
    SELECT
        e.employeeId, 
        es.FunctionId,
        ef.Label,
        c.CompanyName,
        realOrder = row_number() over(partition by e.employeeId order by isnull(es.sortOrder, 9999))
    FROM        
        employee e 
        LEFT JOIN employee_scope es ON es.employeeId = e.employeeId
        LEFT JOIN employee_function ef ON es.FunctionId = ef.FunctionId
        LEFT JOIN company c ON es.CompanyId = c.ID
    WHERE e.EmployeeId=54
)
SELECT
    employeeId, 
    FunctionId,
    Label,
    CompanyName = STRING_AGG(CompanyName, ',') WITHIN GROUP (ORDER BY realOrder),
    Primacy = CASE ROW_NUMBER() OVER(ORDER BY MIN(realOrder))
        WHEN 1 THEN 'primary'
        WHEN 2 THEN 'secondary'
        WHEN 3 THEN 'tertiary'
    END 
FROM employeeScopeFunctions
GROUP BY
    employeeId, 
    FunctionId,
    Label

Альтернативное решение с дополнительным уровнем вложенности, чтобы избежать вложенностиоконная функция и агрегация:

WITH employeeScopeFunctions as (
    SELECT
        e.employeeId, 
        es.FunctionId,
        ef.Label,
        c.CompanyName,
        realOrder = row_number() over(partition by e.employeeId order by isnull(es.sortOrder, 9999))
    FROM        
        employee e 
        LEFT JOIN employee_scope es ON es.employeeId = e.employeeId
        LEFT JOIN employee_function ef ON es.FunctionId = ef.FunctionId
        LEFT JOIN company c ON es.CompanyId = c.ID
    WHERE e.EmployeeId=54
)
SELECT
    employeeId, 
    FunctionId,
    Label,
    CompanyName,
    Primacy = CASE ROW_NUMBER() OVER(ORDER BY minRealOrder))
        WHEN 1 THEN 'primary'
        WHEN 2 THEN 'secondary'
        WHEN 3 THEN 'tertiary'
    END 
FROM (
    SELECT
        employeeId, 
        FunctionId,
        Label,
        CompanyName = STRING_AGG(CompanyName, ',') WITHIN GROUP (ORDER BY realOrder),
        minRealOrder = MIN(realOrder)
    FROM employeeScopeFunctions
    GROUP BY
        employeeId, 
        FunctionId,
        Label
) x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...