具有已知列数的数据透视表

时间:2013-02-05 16:26:22

标签: sql-server sql-server-2008 pivot pivot-table

我有一张看起来像这样的表

OutputTablesID    Label    ColumnOrder
  236             text          1
  236             text          2
  236             text          3
   .                .           .
   .                .           .
   .                .           . 
  236             text         25

我需要表格看起来像这样

OutputTablesID   1>>2>>3>>4>>5>>6>>7>>8>>9>>10>>11>>12>>13>>14>>15

 236>>>>>>>>>Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text

我尝试过从现有的数据透视表中使用的代码,但我不能在聚合函数中使用Label,因为它是一个文本字符串。

这是我在数据透视表中的尝试

 Create  FUNCTION [dbo].[ColOrder] 
(   
)

RETURNS TABLE 

AS

RETURN 

(
   SELECT     OutputTablesId, Label, 1,2,3,4,5,6,7,8,9,10,11,12
    from 
    (
       SELECT OCL.Label, OCL.OutputTablesId
       FROM OCL
    ) AS D
    PIVOT 
    (
        sum(Label) 
        FOR ColumnOrder IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12])
    ) AS P

感谢您的意见和建议!

1 个答案:

答案 0 :(得分:2)

您的代码非常接近,但您尝试在sum()上使用varchar无效。如果您将聚合函数更改为max(),那么它应该可以工作:

select OutputTablesID, [1], [2], [3], [25]
from
(
  select OutputTablesID, Label, ColumnOrder
  from yourtable
) src
pivot
(
  max(label)
  for ColumnOrder in ([1], [2], [3], [25]) -- put other ColumnOrder values here
) piv

请参阅SQL Fiddle with Demo

如果要将其创建为函数,则可以使用:

create function dbo.colorder()
returns table
as
return
select OutputTablesID, [1], [2], [3], [25]
from
(
  select OutputTablesID, Label, ColumnOrder
  from yourtable
) src
pivot
(
  max(label)
  for ColumnOrder in ([1], [2], [3], [25])  -- put other ColumnOrder values here
) piv

请参阅SQL Fiddle with Demo

结果是:

| OUTPUTTABLESID |    1 |    2 |    3 |   25 |
----------------------------------------------
|            236 | text | text | text | text |