2014-10-18 55 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