SQL PIVOT TABLE

时间:2011-06-14 20:15:53

标签: sql tsql

我有以下数据:

ID       Data
1         tera
1         add
1         alkd
2         adf
2         add
3         wer
4         minus
4         add
4         ten

我正在尝试使用数据透视表将行推入1行,每个ID包含多个列。 如下:

ID   Custom1     Custom2    Custom3   Custom4..........
1      tera       add         alkd      
2      adf        add
3      wer
4      minus      add          ten

到目前为止,我有以下查询:

  INSERT INTO @SpeciInfo
(ID, [Custom1], [Custom2], [Custom3], [Custom4], [Custom5],[Custom6],[Custom7],[Custom8],[Custom9],[Custom10],[Custom11],[Custom12],[Custom13],[Custom14],[Custom15],[Custom16])
    SELECT 
        ID,
        [Custom1],
        [Custom2],
        [Custom3],
        [Custom4],
        [Custom5],
        [Custom6],
        [Custom7],
        [Custom8],
        [Custom9],
        [Custom10],
        [Custom11],
        [Custom12],
        [Custom13],
        [Custom14],
        [Custom15],
        [Custom16]
    FROM SpeciInfo) p
    PIVOT
    (
        (
            [Custom1],
            [Custom2], 
            [Custom3], 
            [Custom4],
            [Custom5],
            [Custom6],
            [Custom7],
            [Custom8],
            [Custom9],
            [Custom10],
            [Custom11],
            [Custom12],
            [Custom13],
            [Custom14],
            [Custom15],
            [Custom16]
        )
    ) AS pvt
    ORDER BY ID;

我需要16个字段,但我不完全确定我在From子句中做了什么,或者我是否正确地这样做了?

由于

1 个答案:

答案 0 :(得分:2)

如果您要寻找的是动态构建列,那么通常称为动态交叉表,如果不采用动态SQL(构建查询字符串),则不能在T-SQL中完成,这是不推荐的。相反,您应该在中间层或报告应用程序中构建该查询。

如果您只是想要一个静态解决方案,那么在SQL Server 2005或更高版本中,使用PIVOT查找所需内容的替代方法可能类似:

With NumberedItems As
    (
    Select Id, Data
        , Row_Number() Over( Partition By Id Order By Data ) As ColNum
    From SpeciInfo
    )
Select Id
    , Min( Case When Num = 1 Then Data End ) As Custom1
    , Min( Case When Num = 2 Then Data End ) As Custom2
    , Min( Case When Num = 3 Then Data End ) As Custom3
    , Min( Case When Num = 4 Then Data End ) As Custom4
    ...
From NumberedItems
Group By Id

原始数据中的一个严重问题是没有序列指示符,因此系统无法知道给定ID的哪个项应出现在Custom1列中而不是Custom2列。在上面的查询中,我按名称任意排序。