Как повернуть эту SQL таблицу? - PullRequest
1 голос
/ 06 мая 2020

Я запускаю следующий запрос T- SQL

SELECT [Path],[Access Scope],[Basic Permissions], STRING_AGG([Display Name], ', ') WITHIN GROUP (ORDER BY [Display Name] ASC) AS Accessors
FROM [dbo].[File_Share_Permissions_Report]
GROUP BY [Path],[Access Scope],[Basic Permissions]
ORDER BY [Path]

В результате получается таблица, которая выглядит следующим образом:

  Path                       Access Scope                           Basic Permissions       Accessors
\\network\department\path   This folder and subfolders              List folder contents    Dan, Elroy, Kermit
\\network\department\path   This folder, subfolders, and files      Full control            Jimbob, Tails, Mario
\\network\department\path   This folder, subfolders, and files      Modify                  Elly, Waldo, John

И я пытаюсь изменить запрос чтобы результаты выглядели так:

Path                        List folder contents -This folder and subfolders    Full control - This folder, subfolders, and files   Modify - This folder, subfolders, and files
\\network\department\path   Dan, Elroy, Kermit                                  Jimbob, Tails, Mario                                Elly, Waldo, John

Я долго не мог понять, как это сделать - есть идеи?

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Просто возьмите текущий запрос в качестве входной таблицы для сводного запроса, соединив два столбца ([Basi c Permissions] и [Access Scope]) в один в качестве сводного столбца:

select *
from
(
  SELECT [Path],[Access Scope] + ' - ' + [Basic Permissions] PivotOn, STRING_AGG([Display Name], ', ')             WITHIN GROUP (ORDER BY [Display Name] ASC) AS Accessors
  FROM [dbo].[File_Share_Permissions_Report]
  GROUP BY [Path],[Access Scope],[Basic Permissions]
) pvt
pivot (avg(pvt.Accessors) for pvt.PivotOn in 
        ([This folder and subfolders - List folder contents],
         [This folder, subfolders, and files - Full control],
         [This folder, subfolders, and files - Modify])
) pvted
order by pvted.Path
1 голос
/ 06 мая 2020

Использовать условное агрегирование - выражение CASE:

SELECT [Path], [Access Scope], [Basic Permissions],
       STRING_AGG(CASE WHEN [Basic Permissions] = 'List folder contents' THEN [Display Name] END,  ', ') WITHIN GROUP (ORDER BY [Display Name] ASC) AS list_Accessors
       STRING_AGG(CASE WHEN [Basic Permissions] = 'Full control ' THEN [Display Name] END,  ', ') WITHIN GROUP (ORDER BY [Display Name] ASC) AS full_Accessors
       STRING_AGG(CASE WHEN [Basic Permissions] = 'Modify' THEN [Display Name] END,  ', ') WITHIN GROUP (ORDER BY [Display Name] ASC) AS modify_Accessors
FROM [dbo].[File_Share_Permissions_Report]
GROUP BY [Path],[Access Scope]
ORDER BY [Path]
...