动态数据透视:如何在字符中转换计数(字段)

时间:2017-06-01 16:50:08

标签: 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');
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           |               |    

我想更改 count(corsi)结果:1​​到“x”,0到空。结果只有两个(你无法获得更多结果)。 我想我必须使用“ case when ...”声明,但我不知道如何。

任何帮助将不胜感激。 提前致谢 MSSQL

2 个答案:

答案 0 :(得分: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      |        |        |
+----------+--------+--------+--------+

答案 1 :(得分:0)

另一个选择是暂时扩展您的数据集,使用Union All of a Cross Join of distinct 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