mameesh
mameesh

Reputation: 3761

SQL PIVOT TABLE

I have the following data:

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

I am trying to use a pivot table to push the rows into 1 row with multiple columns per ID. So as follows:

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

I have the following query so far:

  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;

I need the 16 fields, but I am not exactly sure what I do in the From clause or if I'm even doing that correctly?

Thanks

Upvotes: 1

Views: 1203

Answers (1)

Thomas
Thomas

Reputation: 64645

If what you seek is to dynamically build the columns, that is often called a dynamic crosstab and cannot be done in T-SQL without resorting to dynamic SQL (building the string of the query) which is not recommended. Instead, you should build that query in your middle tier or reporting application.

If you simply want a static solution, an alternative to using PIVOT of what you seek might look something like so in SQL Server 2005 or later:

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

One serious problem in your original data is that there is no indicator of sequence and thus there is no means for the system to know which item for a given ID should appear in the Custom1 column as opposed to the Custom2 column. In my query above, I arbitrarily ordered by name.

Upvotes: 2

Related Questions