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