Sql Help

  • Hi Gurus - I have a table that I am trying to query to display all data connected to a id in one row. What is the best way to achieve this?

    something like this:

    ID| CRS1 | CRS2 | CRS3| CRS4 ....

    1 | A101 | A102 | A103 | A104 ....

    CREATE TABLE Class

    (

    id int,

    yr int,

    trm varchar(2),

    crs varchar(30)

    )

    INSERT INTO dbo.Class

    (dbo.Class.id,dbo.Class.yr,dbo.Class.trm,dbo.Class.crs)

    VALUES

    (1, 2014, 'F', 'A101' ),

    (1, 2014, 'F', 'A102' ),

    (1, 2014, 'F', 'A103' ),

    (1, 2014, 'F', 'A104' ),

    (1, 2014, 'F', 'A105' ),

    (1, 2014, 'F', 'A106' ),

    (1, 2014, 'F', 'A107' ),

    (1, 2014, 'F', 'A108' ),

    (2, 2014, 'F', 'A101' ),

    (2, 2014, 'F', 'A102' ),

    (2, 2014, 'F', 'A103' ),

    (2, 2014, 'F', 'A104' ),

    (2, 2014, 'F', 'A105' ),

    (2, 2014, 'F', 'A106' ),

    (2, 2014, 'F', 'A107' ),

    (2, 2014, 'F', 'A108' )

  • Sorry this is a bit of a "It Depends" answer. If you are only going to have up to eight courses then the following will do what you want.

    WITH SequenceRows AS (

    SELECT ID, Yr, Trm, Crs, ROW_NUMBER() OVER (PARTITION BY ID, Yr, Trm ORDER BY crs) Seq

    FROM Class

    )

    SELECT ID, Yr, Trm,

    MAX(CASE WHEN Seq = 1 THEN CRS END) CRS1,

    MAX(CASE WHEN Seq = 2 THEN CRS END) CRS2,

    MAX(CASE WHEN Seq = 3 THEN CRS END) CRS3,

    MAX(CASE WHEN Seq = 4 THEN CRS END) CRS4,

    MAX(CASE WHEN Seq = 5 THEN CRS END) CRS5,

    MAX(CASE WHEN Seq = 6 THEN CRS END) CRS6,

    MAX(CASE WHEN Seq = 7 THEN CRS END) CRS7,

    MAX(CASE WHEN Seq = 8 THEN CRS END) CRS8

    FROM SequenceRows

    GROUP BY ID, Yr, Trm

    Otherwise if you have an uncertain amount of course per ID, then you may want to do a dynamic cross tab[/url] as described in the article by Jeff Moden. The first part[/url] of the article describes doing a cross tab query.

  • If the data doesn't need to be in seperate columns, you can just concatenate the row values (and this works better if there is no fixed number of values):

    Concatenating Row Values in Transact-SQL[/url]

    Need an answer? No, you need a question
    My blog at https://sqlkover.com.
    MCSE Business Intelligence - Microsoft Data Platform MVP

  • mickyT (10/23/2014)


    Sorry this is a bit of a "It Depends" answer. If you are only going to have up to eight courses then the following will do what you want.

    WITH SequenceRows AS (

    SELECT ID, Yr, Trm, Crs, ROW_NUMBER() OVER (PARTITION BY ID, Yr, Trm ORDER BY crs) Seq

    FROM Class

    )

    SELECT ID, Yr, Trm,

    MAX(CASE WHEN Seq = 1 THEN CRS END) CRS1,

    MAX(CASE WHEN Seq = 2 THEN CRS END) CRS2,

    MAX(CASE WHEN Seq = 3 THEN CRS END) CRS3,

    MAX(CASE WHEN Seq = 4 THEN CRS END) CRS4,

    MAX(CASE WHEN Seq = 5 THEN CRS END) CRS5,

    MAX(CASE WHEN Seq = 6 THEN CRS END) CRS6,

    MAX(CASE WHEN Seq = 7 THEN CRS END) CRS7,

    MAX(CASE WHEN Seq = 8 THEN CRS END) CRS8

    FROM SequenceRows

    GROUP BY ID, Yr, Trm

    Otherwise if you have an uncertain amount of course per ID, then you may want to do a dynamic cross tab[/url] as described in the article by Jeff Moden. The first part[/url] of the article describes doing a cross tab query.

    Thanks MikeyT

Viewing 4 posts - 1 through 3 (of 3 total)

You must be logged in to reply to this topic. Login to reply