我使用动态数据透视作为此示例,它可以正常工作。
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
答案 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