Обратный столбец и строки в SQL - PullRequest
0 голосов
/ 30 января 2019

Я должен создать запрос, чтобы изменить строки и столбцы правильно.Я использую MS SQL SERVER 2016.

Это то, что у меня есть:

Row_ID | Group_ID | Group_Status | MemberRole | name
2807   | 10568    | accept       | chairman   | Rajah
2808   | 10568    | accept       | member     | Vaughan
2812   | 10568    | accept       | secretary  | Susan

Это то, что мне нужно:

Group_ID | Status | Chairman | Secretary | Member1 | Member2 | Member3 | ... | Member20 
10568    | Accept | Rajah    | Susan     | Vaughan | Kane    | Oprah   | ... | Imelda

(пользователи с ролью участника могут быть в диапазоне от 0 до 20)

Возможно, мне следует использовать сводку, но я не знаю, как.

Хорошо, у меня есть этот код:

 SELECT *
FROM
(
    SELECT group_id, 
       group_status, 
       memberRole, 
       name
FROM DataGroup
) dataSource PIVOT(MAX(name) FOR memberRole IN([chairman], 
                                           [secretary], 
                                           [member])) pivotTab;

Но я теряю строки с элементами (получаю только один элемент), как извлечь их в столбцы?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Я бы просто использовал условное агрегирование:

select group_id, group_status,
       max(case when member_role = 'chairman' then name end) as chairman,
       max(case when member_role = 'secretary' then name end) as secretary,
       max(case when member_role = 'member' and seqnum = 1 then name end) as member_01,
       max(case when member_role = 'member' and seqnum = 2 then name end) as member_02,
       . . .
from (select m.*,
             row_number() over (partition by group_id, member_role order by row_id) as seqnum
      from @mockup m
     ) m
group by group_id, group_status;

Я считаю, что условное агрегирование гораздо более гибкое, чем pivot.Это пример ситуации, когда запрос проще.

0 голосов
/ 30 января 2019

Вы можете попробовать это с unioned запросом:

Некоторым макетом (пожалуйста, предоставьте такую ​​фиктивную таблицу со своими образцами данных в следующем вопросе):

DECLARE @mockup TABLE(Row_ID INT,Group_ID INT,Group_Status VARCHAR(100),MemberRole VARCHAR(100),[name] VARCHAR(100));
INSERT INTO @mockup VALUES
 (2807,10568,'accept','chairman','Rajah')
,(2808,10568,'accept','member','Vaughan')
,(2812,10568,'accept','secretary','Susan')
,(2899,10568,'accept','member','Onemore');

- Запрос

SELECT p.*
FROM
(
    SELECT Group_ID
          ,Group_Status
          ,[name]
          ,MemberRole
    FROM @mockup 
    WHERE MemberRole IN('chairman','secretary')

    UNION ALL
    SELECT Group_ID
          ,Group_Status
          ,[name]
          ,CONCAT('Member',ROW_NUMBER() OVER(PARTITION BY Group_ID ORDER BY Row_ID))  
    FROM @mockup 
    WHERE MemberRole='member'
) t
PIVOT
(
    MAX([name]) FOR MemberRole IN(Chairman,Secretary,Member1,Member2,Member3 /*add as many as you need*/)
) p;

Результат

Group_ID    Group_Status    Chairman    Secretary   Member1     Member2     Member3
10568       accept          Rajah       Susan       Vaughan     Onemore     NULL

Короче:

Первая часть запроса Просто выберет два имени исправления.

Вторая часть выберет членов и отсортирует их по их Row_ID.

Затем PIVOT преобразует это в одну строку, используя столбец MemberRole для нового столбца.имена.

Вам придется подумать еще о некоторых вещах:

  • Что, если не все строки accepted?
  • Что из множества групп?

Если вам нужна помощь, вы можете вернуться с новым вопросом.Удачного кодирования!

...