Pivot Columns to Rows in SQL Server










2















I have a query that returns an entire row and I need to pivot this result into a new table.



SELECT id_no, stud_name, group_no, class_1, class_2, class_3, class_4 FROM tbl_stud_class


This returns the following:



| id_no | stud_name | group_no | class_1 | class_2 | class_3 | class 4 |
| 1 | John Doe | A11 | 84 | 60 | 80 | 79 |


I need to be able to return this row as:



| id_no | stud_name | group_no | class | grade |
| 1 | John Doe | A11 | class_1 | 84 |
| 1 | John Doe | A11 | class_2 | 60 |
| 1 | John Doe | A11 | class_3 | 80 |
| 1 | John Doe | A11 | class_4 | 79 |


Can someone point me to a way to do this please?
I am converting my PostgreSQL function (where i'm using CROSS JOIN LATERAL to SQL Server)



Thank you!










share|improve this question


























    2















    I have a query that returns an entire row and I need to pivot this result into a new table.



    SELECT id_no, stud_name, group_no, class_1, class_2, class_3, class_4 FROM tbl_stud_class


    This returns the following:



    | id_no | stud_name | group_no | class_1 | class_2 | class_3 | class 4 |
    | 1 | John Doe | A11 | 84 | 60 | 80 | 79 |


    I need to be able to return this row as:



    | id_no | stud_name | group_no | class | grade |
    | 1 | John Doe | A11 | class_1 | 84 |
    | 1 | John Doe | A11 | class_2 | 60 |
    | 1 | John Doe | A11 | class_3 | 80 |
    | 1 | John Doe | A11 | class_4 | 79 |


    Can someone point me to a way to do this please?
    I am converting my PostgreSQL function (where i'm using CROSS JOIN LATERAL to SQL Server)



    Thank you!










    share|improve this question
























      2












      2








      2








      I have a query that returns an entire row and I need to pivot this result into a new table.



      SELECT id_no, stud_name, group_no, class_1, class_2, class_3, class_4 FROM tbl_stud_class


      This returns the following:



      | id_no | stud_name | group_no | class_1 | class_2 | class_3 | class 4 |
      | 1 | John Doe | A11 | 84 | 60 | 80 | 79 |


      I need to be able to return this row as:



      | id_no | stud_name | group_no | class | grade |
      | 1 | John Doe | A11 | class_1 | 84 |
      | 1 | John Doe | A11 | class_2 | 60 |
      | 1 | John Doe | A11 | class_3 | 80 |
      | 1 | John Doe | A11 | class_4 | 79 |


      Can someone point me to a way to do this please?
      I am converting my PostgreSQL function (where i'm using CROSS JOIN LATERAL to SQL Server)



      Thank you!










      share|improve this question














      I have a query that returns an entire row and I need to pivot this result into a new table.



      SELECT id_no, stud_name, group_no, class_1, class_2, class_3, class_4 FROM tbl_stud_class


      This returns the following:



      | id_no | stud_name | group_no | class_1 | class_2 | class_3 | class 4 |
      | 1 | John Doe | A11 | 84 | 60 | 80 | 79 |


      I need to be able to return this row as:



      | id_no | stud_name | group_no | class | grade |
      | 1 | John Doe | A11 | class_1 | 84 |
      | 1 | John Doe | A11 | class_2 | 60 |
      | 1 | John Doe | A11 | class_3 | 80 |
      | 1 | John Doe | A11 | class_4 | 79 |


      Can someone point me to a way to do this please?
      I am converting my PostgreSQL function (where i'm using CROSS JOIN LATERAL to SQL Server)



      Thank you!







      sql-server pivot






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 12 '18 at 21:03









      SmileySmiley

      1,057103658




      1,057103658






















          3 Answers
          3






          active

          oldest

          votes


















          4














          Just another option is using a CROSS APPLY



          Example



          Select A.id_no
          ,A.stud_name
          ,A.group_no
          ,B.*
          From YourTable A
          Cross Apply ( values ('class_1',class_1)
          ,('class_2',class_2)
          ,('class_3',class_3)
          ,('class_4',class_4)
          ) B(class,grade)


          Returns



          id_no stud_name group_no class grade
          1 John Doe A11 class_1 84
          1 John Doe A11 class_2 60
          1 John Doe A11 class_3 80
          1 John Doe A11 class_4 79





          share|improve this answer






























            1














            You can use UNPIVOT to get this done in SQL Server. Below is an example using your sample data.



            CREATE TABLE #tbl_stud_class
            (
            id_no int,
            stud_name varchar(50),
            group_no varchar(50),
            class_1 int,
            class_2 int,
            class_3 int,
            class_4 int
            )

            INSERT INTO #tbl_stud_class VALUES (1, 'John Doe', 'A11', 84, 60, 80, 79)

            SELECT *
            FROM #tbl_stud_class
            UNPIVOT
            (
            Class FOR Classes IN (class_1, class_2, class_3, class_4)
            ) AS UP

            DROP TABLE #tbl_stud_class





            share|improve this answer
































              0














              Based on your example, I'd do something like this:



              Select
              id_no
              , stud_name
              , group_no
              , 'class_1'
              , class_1 as grade
              From tbl_stud_class

              Union All

              Select
              id_no
              , stud_name
              , group_no
              , 'class_2'
              , class_2 as grade
              From tbl_stud_class

              Union All

              etc.


              I would also use the full word "student" in my table and field names, but that's not really a database issue... ;)






              share|improve this answer






















                Your Answer






                StackExchange.ifUsing("editor", function ()
                StackExchange.using("externalEditor", function ()
                StackExchange.using("snippets", function ()
                StackExchange.snippets.init();
                );
                );
                , "code-snippets");

                StackExchange.ready(function()
                var channelOptions =
                tags: "".split(" "),
                id: "1"
                ;
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function()
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled)
                StackExchange.using("snippets", function()
                createEditor();
                );

                else
                createEditor();

                );

                function createEditor()
                StackExchange.prepareEditor(
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: true,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: 10,
                bindNavPrevention: true,
                postfix: "",
                imageUploader:
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                ,
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                );



                );













                draft saved

                draft discarded


















                StackExchange.ready(
                function ()
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270062%2fpivot-columns-to-rows-in-sql-server%23new-answer', 'question_page');

                );

                Post as a guest















                Required, but never shown

























                3 Answers
                3






                active

                oldest

                votes








                3 Answers
                3






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                4














                Just another option is using a CROSS APPLY



                Example



                Select A.id_no
                ,A.stud_name
                ,A.group_no
                ,B.*
                From YourTable A
                Cross Apply ( values ('class_1',class_1)
                ,('class_2',class_2)
                ,('class_3',class_3)
                ,('class_4',class_4)
                ) B(class,grade)


                Returns



                id_no stud_name group_no class grade
                1 John Doe A11 class_1 84
                1 John Doe A11 class_2 60
                1 John Doe A11 class_3 80
                1 John Doe A11 class_4 79





                share|improve this answer



























                  4














                  Just another option is using a CROSS APPLY



                  Example



                  Select A.id_no
                  ,A.stud_name
                  ,A.group_no
                  ,B.*
                  From YourTable A
                  Cross Apply ( values ('class_1',class_1)
                  ,('class_2',class_2)
                  ,('class_3',class_3)
                  ,('class_4',class_4)
                  ) B(class,grade)


                  Returns



                  id_no stud_name group_no class grade
                  1 John Doe A11 class_1 84
                  1 John Doe A11 class_2 60
                  1 John Doe A11 class_3 80
                  1 John Doe A11 class_4 79





                  share|improve this answer

























                    4












                    4








                    4







                    Just another option is using a CROSS APPLY



                    Example



                    Select A.id_no
                    ,A.stud_name
                    ,A.group_no
                    ,B.*
                    From YourTable A
                    Cross Apply ( values ('class_1',class_1)
                    ,('class_2',class_2)
                    ,('class_3',class_3)
                    ,('class_4',class_4)
                    ) B(class,grade)


                    Returns



                    id_no stud_name group_no class grade
                    1 John Doe A11 class_1 84
                    1 John Doe A11 class_2 60
                    1 John Doe A11 class_3 80
                    1 John Doe A11 class_4 79





                    share|improve this answer













                    Just another option is using a CROSS APPLY



                    Example



                    Select A.id_no
                    ,A.stud_name
                    ,A.group_no
                    ,B.*
                    From YourTable A
                    Cross Apply ( values ('class_1',class_1)
                    ,('class_2',class_2)
                    ,('class_3',class_3)
                    ,('class_4',class_4)
                    ) B(class,grade)


                    Returns



                    id_no stud_name group_no class grade
                    1 John Doe A11 class_1 84
                    1 John Doe A11 class_2 60
                    1 John Doe A11 class_3 80
                    1 John Doe A11 class_4 79






                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered Nov 12 '18 at 21:50









                    John CappellettiJohn Cappelletti

                    46.8k62547




                    46.8k62547























                        1














                        You can use UNPIVOT to get this done in SQL Server. Below is an example using your sample data.



                        CREATE TABLE #tbl_stud_class
                        (
                        id_no int,
                        stud_name varchar(50),
                        group_no varchar(50),
                        class_1 int,
                        class_2 int,
                        class_3 int,
                        class_4 int
                        )

                        INSERT INTO #tbl_stud_class VALUES (1, 'John Doe', 'A11', 84, 60, 80, 79)

                        SELECT *
                        FROM #tbl_stud_class
                        UNPIVOT
                        (
                        Class FOR Classes IN (class_1, class_2, class_3, class_4)
                        ) AS UP

                        DROP TABLE #tbl_stud_class





                        share|improve this answer





























                          1














                          You can use UNPIVOT to get this done in SQL Server. Below is an example using your sample data.



                          CREATE TABLE #tbl_stud_class
                          (
                          id_no int,
                          stud_name varchar(50),
                          group_no varchar(50),
                          class_1 int,
                          class_2 int,
                          class_3 int,
                          class_4 int
                          )

                          INSERT INTO #tbl_stud_class VALUES (1, 'John Doe', 'A11', 84, 60, 80, 79)

                          SELECT *
                          FROM #tbl_stud_class
                          UNPIVOT
                          (
                          Class FOR Classes IN (class_1, class_2, class_3, class_4)
                          ) AS UP

                          DROP TABLE #tbl_stud_class





                          share|improve this answer



























                            1












                            1








                            1







                            You can use UNPIVOT to get this done in SQL Server. Below is an example using your sample data.



                            CREATE TABLE #tbl_stud_class
                            (
                            id_no int,
                            stud_name varchar(50),
                            group_no varchar(50),
                            class_1 int,
                            class_2 int,
                            class_3 int,
                            class_4 int
                            )

                            INSERT INTO #tbl_stud_class VALUES (1, 'John Doe', 'A11', 84, 60, 80, 79)

                            SELECT *
                            FROM #tbl_stud_class
                            UNPIVOT
                            (
                            Class FOR Classes IN (class_1, class_2, class_3, class_4)
                            ) AS UP

                            DROP TABLE #tbl_stud_class





                            share|improve this answer















                            You can use UNPIVOT to get this done in SQL Server. Below is an example using your sample data.



                            CREATE TABLE #tbl_stud_class
                            (
                            id_no int,
                            stud_name varchar(50),
                            group_no varchar(50),
                            class_1 int,
                            class_2 int,
                            class_3 int,
                            class_4 int
                            )

                            INSERT INTO #tbl_stud_class VALUES (1, 'John Doe', 'A11', 84, 60, 80, 79)

                            SELECT *
                            FROM #tbl_stud_class
                            UNPIVOT
                            (
                            Class FOR Classes IN (class_1, class_2, class_3, class_4)
                            ) AS UP

                            DROP TABLE #tbl_stud_class






                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited Nov 12 '18 at 21:16

























                            answered Nov 12 '18 at 21:11









                            Chris AlbertChris Albert

                            1,50221522




                            1,50221522





















                                0














                                Based on your example, I'd do something like this:



                                Select
                                id_no
                                , stud_name
                                , group_no
                                , 'class_1'
                                , class_1 as grade
                                From tbl_stud_class

                                Union All

                                Select
                                id_no
                                , stud_name
                                , group_no
                                , 'class_2'
                                , class_2 as grade
                                From tbl_stud_class

                                Union All

                                etc.


                                I would also use the full word "student" in my table and field names, but that's not really a database issue... ;)






                                share|improve this answer



























                                  0














                                  Based on your example, I'd do something like this:



                                  Select
                                  id_no
                                  , stud_name
                                  , group_no
                                  , 'class_1'
                                  , class_1 as grade
                                  From tbl_stud_class

                                  Union All

                                  Select
                                  id_no
                                  , stud_name
                                  , group_no
                                  , 'class_2'
                                  , class_2 as grade
                                  From tbl_stud_class

                                  Union All

                                  etc.


                                  I would also use the full word "student" in my table and field names, but that's not really a database issue... ;)






                                  share|improve this answer

























                                    0












                                    0








                                    0







                                    Based on your example, I'd do something like this:



                                    Select
                                    id_no
                                    , stud_name
                                    , group_no
                                    , 'class_1'
                                    , class_1 as grade
                                    From tbl_stud_class

                                    Union All

                                    Select
                                    id_no
                                    , stud_name
                                    , group_no
                                    , 'class_2'
                                    , class_2 as grade
                                    From tbl_stud_class

                                    Union All

                                    etc.


                                    I would also use the full word "student" in my table and field names, but that's not really a database issue... ;)






                                    share|improve this answer













                                    Based on your example, I'd do something like this:



                                    Select
                                    id_no
                                    , stud_name
                                    , group_no
                                    , 'class_1'
                                    , class_1 as grade
                                    From tbl_stud_class

                                    Union All

                                    Select
                                    id_no
                                    , stud_name
                                    , group_no
                                    , 'class_2'
                                    , class_2 as grade
                                    From tbl_stud_class

                                    Union All

                                    etc.


                                    I would also use the full word "student" in my table and field names, but that's not really a database issue... ;)







                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered Nov 12 '18 at 21:11









                                    BrianBrian

                                    9542716




                                    9542716



























                                        draft saved

                                        draft discarded
















































                                        Thanks for contributing an answer to Stack Overflow!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid


                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.

                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function ()
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270062%2fpivot-columns-to-rows-in-sql-server%23new-answer', 'question_page');

                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

                                        Edmonton

                                        Crossroads (UK TV series)