数据透视表问题:原始表或枚举中没有标识符

时间:2013-10-31 14:28:20

标签: sql sql-server pivot

我在使用数据透视表或动态表时遇到问题。

我发现这个例子非常有助于理解我如何完成这项任务;但是,我错过了内部标识符列。

Dynamic Pivot Columns in SQL Server

上面的帖子中提供了一个SQL小提琴:http://www.sqlfiddle.com/#!3/7fad2/6

您可以看到在第二个表propertyObjects中,每个objectID都有一个计数1,2,3,4。我没有那个propertyID计数。这就是我的全部

case  category
1      xx
1      xyx
1      abc
2      ghj
2      asdf
3      dfgh

如您所见,每种情况都有多种不同的类别,但没有类别标识符字段。

这就是我需要的:

case  cat1  cat2  cat3
1     xx    xyx   abc
2     ghj   asdf
3     dfgh

所以我想我可能需要在源表中添加一个列,并以某种方式枚举每个案例的类别。这将使我可以在提供的示例中使用枢轴。思考?

我尝试使用row_number来完成此操作,但它并不会停留在每个案例编号上,而是继续计算整个表格。

1 个答案:

答案 0 :(得分:1)

由于每个case都有多个值,因此您需要使用row_number()为每个类别获取单独的列。

在编写动态SQL版本之前,我会首先编写一个硬编码版本。代码类似于:

SELECT [case], cat1, cat2, cat3
FROM
(
    SELECT [case], category,
      'cat'+
        cast(row_number() over(partition by [case] 
                               order by category) as varchar(10)) seq
    FROM yourTable
) x
PIVOT
(
   max(category)
   for seq in (cat1, cat2, cat3)
)p;

请参阅SQL Fiddle with Demo

现在你有了逻辑,然后你可以将它转换为动态SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('cat'+cast(seq as varchar(10))) 
                    from
                    (
                      select row_number() over(partition by [case] 
                                               order by category) seq
                      from yourtable
                    ) d
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [case],' + @cols + ' 
            from 
            (
              SELECT [case], category,
                ''cat''+
                  cast(row_number() over(partition by [case] 
                                         order by category) as varchar(10)) seq
              FROM yourTable
            ) x
            pivot 
            (
                max(category)
                for seq in (' + @cols + ')
            ) p '

execute sp_executesql @query;

SQL Fiddle with Demo。这将给你结果:

| CASE | CAT1 |   CAT2 |   CAT3 |
|------|------|--------|--------|
|    1 |  abc |     xx |    xyx |
|    2 | asdf |    ghj | (null) |
|    3 | dfgh | (null) | (null) |