Sql server 动态轴心:如何转换字符计数(字段)

Sql server 动态轴心:如何转换字符计数(字段),sql-server,Sql Server,我使用了一个动态轴心作为这个例子,它是有效的 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');

我使用了一个动态轴心作为这个例子,它是有效的

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           |               |    
我想更改计数(corsi)结果:1为“x”,0为空。只有两个结果(您无法获得更多结果)。 我想我必须使用“case when…”语句,但我不知道如何使用

任何帮助都将不胜感激。 提前谢谢
MSSql

您可以按如下方式使用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      |        |        |
+----------+--------+--------+--------+

您可以按如下方式使用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      |        |        |
+----------+--------+--------+--------+

另一个选择是临时扩展数据集,将所有不同的persona和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        

另一个选择是临时扩展数据集,将所有不同的persona和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