2016-12-16 236 views
1

我有以下数据透视表数据

NAME | RIGHTS | 
Steven | add | 
Steven | update | 
Steven | delete | 
Mark | update | 
Mark | delete | 
Joseph | don’t have Rights | 
Spike | add | 
Spike | update | 
Spike | delete | 

而这个数据,我想操纵作为

NAMEs | don’t have Rights | add| update | delete | 

Steven | 0 |1|1|1| 

Mark |0|0|1|1| 

Joseph |1|0|0|0| 

Spike |0|1|1|1| 

请注意,我没有任何类型的权利的想法,也可以是上述100

+0

这是任何特定的数据库? SQL Server? MySQL的?等等? –

+0

使用SQL Server – SAURABH

+0

Saurabh,Name&Rights是两个不同的列? –

回答

1

我得到了答案

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',[' + Rights +']' 
        from MyTableName 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 



set @query = 'SELECT Name,' + @cols + ' from 
      (
       SELECT Name, Rights,1 as xCount FROM MyTableName 
      ) x 
      pivot 
      (
       count(xCount) 
       for Rights in (' + @cols + ') 
      ) p ' 

execute(@query); 
1
**Using pivot to get that result :** 

CREATE TABLE #details(Id INT,NAME VARCHAR(100), RIGHTS VARCHAR(100)) 
INSERT INTO #details(Id ,NAME , RIGHTS) 
SELECT 1,'Steven','add' UNION ALL 
SELECT 1,'Steven','update' UNION ALL 
SELECT 1,'Steven','delete' UNION ALL 
SELECT 1,'Mark','update' UNION ALL 
SELECT 1,'Mark','delete' UNION ALL 
SELECT 1,'Joseph','don’t have Rights' UNION ALL 
SELECT 1,'Spike','add' UNION ALL 
SELECT 1,'Spike','update' UNION ALL 
SELECT 1,'Spike','delete' 

SELECT * 
FROM 
(
    SELECT NAME , RIGHTS ,Id 
    FROM #details 
)A 
PIVOT 
(
    MAX(Id) FOR RIGHTS IN ([don’t have Rights],[add],[update],[delete]) 
)pvt 

**For Dynamic pivot use below query :** 

DECLARE @DynamicCol VARCHAR(MAX) = '',@DynamicPvt VARCHAR(MAX) = '' 

SELECT @DynamicCol = 
(
    SELECT STUFF ((SELECT DISTINCT ',' + '[' + RTRIM(RIGHTS) + ']' FROM  
    #details FOR XML PATH('')),1,1,'') 
) 

SET @DynamicPvt = 'SELECT * 
FROM 
(
SELECT NAME , RIGHTS ,Id 
FROM #details 
)A 
PIVOT 
(
    MAX(Id) FOR RIGHTS IN ('[email protected]+') 
)pvt' 

EXEC (@DynamicPvt) 
+0

Mansoor,谢谢你的回答是正确的,但正如我告诉我,我不知道确切的权利数,这个问题我已经解决了我的答案。 – SAURABH

+0

使用动态数据透视权获得'n'个权利 – Mansoor

0

选中此项。

  select NAME, 
      case when [don’t have Rights] is not null then 1 else 0 end as [don’t have Rights] , 
      case when [add] is not null then 1 else 0 end as [add] , 
      case when [update] is not null then 1 else 0 end as [update] , 
      case when [delete] is not null then 1 else 0 end as [delete] 
      from 
      (
      select * 
      from #YourTAble 
      pivot 
      (
      max(RIGHTS) for RIGHTS in ([don’t have Rights],[delete],[update],[add]) 
      )a 
      )b 

输出:

enter image description here

0
Declare @Str varchar(max) 
, @FinalStr varchar(max) 
Set @Str='' 
Select @Str = @Str + ',[' + Rights+']' 
FROM (Select Distinct Rights FROM F2) A 
Set @Str= Substring(@str,2,LEN(@Str)) 

SET @FinalStr = 
'Select Name, ' + @Str + 
'FROM F2 
PIVOT (Count(Rights)For Rights in (' + @Str + ')) As A' 

Exec (@FinalStr) 

这将给欲望的结果,它是动态的一样。你可以拥有一些权利。