Вывод сводного SQL-запроса - PullRequest
0 голосов
/ 09 октября 2018

У меня есть требование, чтобы мой запрос возвращал вывод примерно так:

PermissionType  IsAllowed
-------------------------
IsEdit        |  1
IsDelete      |  0
isRemove      |  1
isPrint       |  1
isReport      |  0
--            |  -
--            |  -
--            |  -
--------------------------

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

Так что теперь я хочучтобы преобразовать приведенный выше набор результатов в следующее:

IsEdit | IsDelete | IsRemove | IsPrint | IsReport | -- | -- | --
--------------------------------------------------------------------
1      | 0        | 1        | 1       | 0        | -  | -  | -

Я попытался использовать сводку здесь, но он просит, чтобы имена столбцов были повернуты в выводе, и это динамично в моем случае, также он нуждался в агрегатефункция для FOR, но у меня нет никаких расчетов в моем случае.

Кто-нибудь, пожалуйста, помогите мне в этом.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

С помощью pivot и динамического sql вы можете создать запрос, который будет включать различное количество столбцов:

if OBJECT_ID('Test') is not null 
drop table [dbo].[Test] 

CREATE TABLE [dbo].[Test](PermissionType varchar(20), IsAllowed int)

insert into [dbo].[Test] values
 ('IsEdit'  , 1)
,('IsDelete', 0)
,('isRemove', 1)
,('isPrint' , 1)
,('isReport', 0)

--this variable holds all the dates that will become column names 
declare @permissionTypes nvarchar(max) = '' 

--this variable contains the TSQL dinamically generated
declare @sql nvarchar(max) = ''  

select @permissionTypes = @permissionTypes + ', ' + quotename(PermissionType) 
from [dbo].[Test]  

set @permissionTypes = RIGHT(@permissionTypes, len(@permissionTypes)-2) 

set @sql = concat(
 'select *
    from [dbo].[Test]  
    pivot 
    ( 
    max(isallowed) 
    for PermissionType in (', @permissionTypes, ') 
    ) piv '
 )
 exec(@sql)

Результат:

enter image description here

Добавление новой строки:

insert into [dbo].[Test] values
 ('IsNew'  , 1)

Вызывает создание нового столбца:

enter image description here

0 голосов
/ 09 октября 2018

Тогда попробуйте этот Dynamic sql

IF OBJECT_ID('dbo.temp')IS NOT NULL
DROP TABLE temp
;WITH Cte(PermissionType, IsAllowed)
AS
(
SELECT 'IsEdit'   ,  1 UNION ALL
SELECT 'IsDelete' ,  0 UNION ALL
SELECT 'isRemove' ,  1 UNION ALL
SELECT 'isPrint'  ,  1 UNION ALL
SELECT 'isReport' ,  0
)
SELECT  *,ROW_NUMBER()OVER(ORDER BY (SELECT 1)) AS Seq INTO 
temp FROM Cte

DECLARE @Sql nvarchar(max),
        @Sqlcol  nvarchar(max),
        @ISNULLSqlcol nvarchar(max)

SELECT  @Sqlcol=STUFF((SELECT   ', '+QUOTENAME(PermissionType) 
                FROM temp  ORDER BY Seq FOR XML PATH ('')),1,1,'')

SELECT  @ISNULLSqlcol=STUFF((SELECT   ', '+'MAX('+QUOTENAME(PermissionType) +') AS '+QUOTENAME(PermissionType)
                FROM temp ORDER BY Seq FOR XML PATH ('')),1,1,'')

SET @Sql='
        SELECT '+@ISNULLSqlcol+'
        FROM(
        SELECT * FROM temp
        )AS SRC
        PIVOT 
        (
        MAX(IsAllowed) FOR PermissionType IN ('+@Sqlcol+')
        ) AS PVT '
PRINT @Sql
EXEC (@Sql)

IsEdit  IsDelete    isRemove    isPrint isReport
--------------------------------------------------
1         0             1           1       0
...