2017-06-01 59 views
1

我使用动态数据透视作为此示例,它工作正常。动态数据透视:字符中变换数(字段)的方式

create table formazione (
persona nvarchar(20), 
corsi nvarchar(20) 
) 

insert into formazione values ('mario', 'corso1'); 
insert into formazione values ('giovanni', 'corso1'); 
insert into formazione values ('antonio', 'corso2'); 
insert into formazione values ('marco', 'corso2'); 
insert into formazione values ('giacomo', 'corso3'); 
insert into formazione values ('andrea', 'corso3'); 

select * from formazione; 


declare @col as nvarchar(max), 
@query as nvarchar(max); 

set @col = stuff((
select distinct ',' + QUOTENAME(corsi) from formazione FOR XML PATH(''), type) 
.value('.', 'nvarchar(max)'),1,1,''); 

set @query = 'select persona, ' + @col + 
' from formazione 
pivot ( 
count(corsi) for corsi in (' + @col + ') 
) pvt' 

execute (@query); 

结果是

persona  | corso1  | corso2  | corso3 
------  | ----------- | ---------  | ------------ 
andrea  | 0   | 0   | 1 
antonio  | 0   | 1   | 0 
giacomo  | 0   | 0   | 1 
giovanni | 1   | 0   | 0 
marco  | 0   | 1   | 0 
mario  | 1   | 0   | 0 

我想获得这样的

persona  | corso1  | corso2  | corso3 
------  | ----------- | ---------  | ------------ 
andrea  |    |    | x 
antonio  |    | x   |  
giacomo  |    |    | x 
giovanni | x   |    |  
marco  |    | x   |  
mario  | x   |    |  

我想改变计数(科西)结果的结果:1,以 “×” ,0为空。只有两个结果(你不能得到更多的结果)。 我认为我必须使用“的情况下,当 ...”的声明,但我不知道如何。

任何帮助,将不胜感激。 在此先感谢 MSSQL

回答

0

您可以使用IIF如下:

declare @col as nvarchar(max), 
@selcol as nvarchar(max), --new variable 
@query as nvarchar(max); 

set @col = stuff((
select distinct ',' + QUOTENAME(corsi) from formazione FOR XML PATH(''), type) 
.value('.', 'nvarchar(max)'),1,1,''); 

set @selcol = stuff((
select distinct ',' + 'iif('+ QUOTENAME(corsi) +'=0,'''',''x'') as '+QUOTENAME(corsi) from formazione FOR XML PATH(''), type) 
.value('.', 'nvarchar(max)'),1,1,''); 

set @query = 'select persona, ' + @selcol + 
' from formazione 
pivot ( 
count(corsi) for corsi in (' + @col + ') 
) pvt' 

select @query 
execute (@query); 

输出

+----------+--------+--------+--------+ 
| persona | corso1 | corso2 | corso3 | 
+----------+--------+--------+--------+ 
| andrea |  |  | x  | 
| antonio |  | x  |  | 
| giacomo |  |  | x  | 
| giovanni | x  |  |  | 
| marco |  | x  |  | 
| mario | x  |  |  | 
+----------+--------+--------+--------+ 
0

另一个选择是暂时扩大你的数据与联盟设置的所有跨的加入不同的角色和corsi。

declare @col as nvarchar(max), 
@query as nvarchar(max); 

set @col = stuff((
select distinct ',' + QUOTENAME(corsi) from formazione FOR XML PATH(''), type) 
.value('.', 'nvarchar(max)'),1,1,''); 



set @query = 'select persona, ' + @col + 
' from (
     Select persona,corsi,value=''X'' from formazione 
     Union All 
     Select P.*,C.* 
     From (Select Distinct persona from formazione) P 
     Cross Join (Select Distinct corsi,Value='' '' from formazione) C 
     ) A 
pivot ( 
max(value) for corsi in (' + @col + ') 
) pvt' 

execute (@query); 

返回

persona corso1 corso2 corso3 
andrea     X 
antonio   X  
giacomo     X 
giovanni  X   
marco   X  
mario X   
相关问题