简体   繁体   English

SQL Server 2008 R2:数据透视表

[英]SQL Server 2008 R2: Pivot table

I have the following table: 我有下表:

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');

Pivot table Query : 数据透视表查询

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( '+@StuffColumn +')
         )p'
PRINT(@SQL)
EXEC(@SQL)           

Error : 错误

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.

Expected Result : 预期结果

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

How about this: 这个怎么样:

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( '+@StuffColumn +')
         )p'
PRINT(@SQL)
EXEC(@SQL)  

You need to give name to your pivot columns. 您需要为透视列命名。

Solution for more than one empty column + dynamic pivot: 多个空列+动态枢轴的解决方案:

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( '+@StuffColumn +')
         )p'
PRINT(@SQL)
EXEC(@SQL)  

Demo here 在这里演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM