2014-10-18 56 views
0

我有如下表:的SQL Server 2008 R2:透视表

CREATE TABLE pvt 
(
cola varchar(10), 
colb varchar(10) 
) 

insert into pvt values('','2'); 
insert into pvt values('1','3'); 
insert into pvt values('9','4'); 
insert into pvt values('8','5'); 

透视表查询

DECLARE @StuffColumn varchar(max) 
DECLARE @sql varchar(max) 

SELECT @StuffColumn = STUFF((SELECT ','+QUOTENAME(cola) 
         FROM pvt 
      FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 
PRINT(@StuffColumn)   

SET @SQL = ' select colb,'+ @StuffColumn +' 
     from 
     (
      select cola,colb 
      from pvt 
     )x 
     pivot 
     (
      count(cola) 
      for cola in('[email protected] +') 
     )p' 
PRINT(@SQL) 
EXEC(@SQL)   

错误

Msg 1038, Level 15, State 4, Line 1 
An object or column name is missing or empty. For SELECT INTO statements, 
verify each column has a name. For other statements, look for empty alias 
names. Aliases defined as "" or [] are not allowed. Change the alias to a valid name. 

预期结果

colb  1 9 8  
------------------- 
2 1 0 0 0 
3 0 1 0 0 
4 0 0 1 0 
5 0 0 0 1 

回答

2

如何:

DECLARE @StuffColumn varchar(max) 
DECLARE @sql varchar(max) 

SELECT @StuffColumn = STUFF((SELECT ','+QUOTENAME(case when cola = '' then 'empty' else cola end) 
         FROM pvt 
      FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 
PRINT(@StuffColumn)   

SET @SQL = ' select colb,'+ @StuffColumn +' 
     from 
     (
      select case when cola = '''' then ''empty'' else cola end as cola,colb 
      from pvt 
     )x 
     pivot 
     (
      count(cola) 
      for cola in('[email protected] +') 
     )p' 
PRINT(@SQL) 
EXEC(@SQL) 

您需要提供姓名,以您的数据透视列。

解决一个以上的空栏+动态透视:

DECLARE @StuffColumn varchar(max) 
DECLARE @sql varchar(max) 

SELECT @StuffColumn = STUFF((SELECT ','+QUOTENAME(case when cola = '' then Cast(ROW_NUMBER() over (order by colb) as varchar (6)) + 'empty' else cola end) 
         FROM pvt 
      FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 
PRINT(@StuffColumn)   

SET @SQL = ' select colb,'+ @StuffColumn +' 
     from 
     (
      select case when cola = '''' then Cast(ROW_NUMBER() over (order by colb) as varchar (6)) +''empty'' else cola end cola,colb 
      from pvt 
     )x 
     pivot 
     (
      count(cola) 
      for cola in('[email protected] +') 
     )p' 
PRINT(@SQL) 
EXEC(@SQL) 

Demo here

+0

非常接近!只有count没有出现在'[empty]'列中。 – Meem 2014-10-18 10:48:45

+1

问题在于如果您有多个空值。 – NMK 2014-10-18 10:48:58

+0

看到我编辑的答案 – Milen 2014-10-18 10:51:48