Группа SQL, которая объединяет 2-ю группу и выделяет первую группу - PullRequest
0 голосов
/ 02 марта 2019

Запрос в настоящее время возвращает

Bob    President     5
Joe    Programmer    3
Greg   Programmer    2
Joe    Janitor       6
Liz    Programmer    6

Но я хочу, чтобы он имел только одну строку для каждого человека, подобного этому

Bob    President     5
Joe    Programmer (or Janitor)  9
Greg   Programmer    2
Liz    Programmer    6

Сейчас я группируюсь по Имени и Роли.Как мне получить только разные имена и объединить это значение?

SELECT
   ...
FROM 
    vw_QuickbaseAudit v
    INNER JOIN [staging].[QuickbaseSystemUsers] qsu ON v.[user] = qsu.UserId
WHERE 
    Date_Modified >= @StartDate
    AND Date_Modified < DATEADD(dd, 1, @EndDate)
GROUP BY
    qsu.UserFirstName + ' ' + qsu.UserLastName, 
    qsu.RoleName
ORDER BY 
    RoleName, 
    NumberOfEditTotal DESC;

Ответы [ 3 ]

0 голосов
/ 02 марта 2019
SELECT qsu.UserFirstName + ' ' + qsu.UserLastName AS "FullName",
    STUFF((SELECT '/' + r.RoleName FROM QuickbaseSystemUsers r on r.UserID = qsu.UserID FOR XML PATH('')), 1, 2, '') as "Roles",
    NumberOfEditTotal << [however you calced this]
FROM vw_QuickbaseAudit v
    INNER JOIN [staging].[QuickbaseSystemUsers] qsu ON v.[user] = qsu.UserId 
WHERE Date_Modified >= @StartDate AND Date_Modified < DATEADD(dd, 1, @EndDate) 
GROUP BY qsu.UserFirstName + ' ' + qsu.UserLastName, 
    STUFF((SELECT '/' + r.RoleName FROM QuickbaseSystemUsers r on r.UserID = qsu.UserID FOR XML PATH('')), 1, 2, '')
ORDER BY RoleName, NumberOfEditTotal DESC;

Какой-то вариант этого (отредактировано: пропущена дополнительная команда STUFF в группе с помощью)

0 голосов
/ 02 марта 2019

Я интерпретирую это:

Joe    Programmer (or Janitor)  9

Как говорится, что все это нормально:

Joe    Programmer  9
Joe    Janitor     9

Запрос будет выглядеть так:

SELECT qsu.UserFirstName + ' ' + qsu.UserLastName, 
       MIN(qsu.RoleName) as RoleName
       SUM(NumberOfEditTotal) as NumberOfEditTotal
FROM vw_QuickbaseAudit v JOIN
     [staging].[QuickbaseSystemUsers] qsu 
     ON v.[user] = qsu.UserId
WHERE Date_Modified >= @StartDate AND
      Date_Modified < DATEADD(day, 1, @EndDate)
GROUP BY qsu.UserFirstName + ' ' + qsu.UserLastName
ORDER BY RoleName, NumberOfEditTotal DESC;

Неясно, как рассчитывается NumberOfEditTotal.

РЕДАКТИРОВАТЬ:

Добавление всех строк в хитрый.В последних версиях SQL Server вы можете использовать STRING_AGG() в качестве функции агрегирования строк.Это просто.

Моя рекомендация в ранних версиях была бы компромиссом.Значения могут быть следующими:

Janitor
Janitor and Programmer 
Janitor, Programmer, and others

Вы можете сделать это с помощью:

(case when min(rolename) = max(rolename)
      then min(rolename)
      when count(distinct rolename) = 2
      then min(rolename) + ' and ' + max(rolename)
      else min(rolename) + ', ' + max(rolename) + ' others'
 end)
0 голосов
/ 02 марта 2019

В основном вам нужно удалить RoleName из предложения GROUP BY.Вы можете выполнить агрегирование строк с помощью STRING_AGG():

SELECT
   qsu.UserFirstName + ' ' + qsu.UserLastName,
   STRING_AGG(RoleName, ' or ') RoleNames,
   ...
FROM 
    vw_QuickbaseAudit v
    INNER JOIN [staging].[QuickbaseSystemUsers] qsu ON v.[user] = qsu.UserId
WHERE 
    Date_Modified >= @StartDate
    AND Date_Modified < DATEADD(dd, 1, @EndDate)
GROUP BY
    qsu.UserFirstName,
    qsu.UserLastName
ORDER BY 
    NumberOfEditTotal DESC;
...