列轉行--行轉列

     問題:使用case when實現行轉列

     解決:

         1、測試準備:

              CREATE  TABLE StudentScores(

                      UserName NVARCHAR2(20), --學生姓名

                      Subject   NVARCHAR2(30), --科目

                          Score     FLOAT         --成績

               );

         2、準備數據:

               INSERT INTO StudentScores values ('Nick', '語文', 80);

               INSERT INTO StudentScores values ('Nick', '數學', 90);

               INSERT INTO StudentScores values ('Nick', '英語', 70);

               INSERT INTO StudentScores values ('Nick', '生物', 85);

               INSERT INTO StudentScores values ('Kent', '語文', 80);

               INSERT INTO StudentScores values ('Kent', '數學', 90);

               INSERT INTO StudentScores values ('Kent', '英語', 70);

               INSERT INTO StudentScores values ('Kent', '生物', 85);

               commit;

            目前的數據形式爲:

                       

            目標的數據形式:

                                              

             3、實現方式:

                  SELECT

                             UserName,

                             MAX(CASE WHEN Subject='語文' THEN Score ELSE 0 END) AS "語文",

                             MAX(CASE WHEN Subject='數學' THEN Score ELSE 0 END) AS "數學",

                             MAX(CASE WHEN Subject='英語' THEN Score ELSE 0 END) AS "英語",

                             MAX(CASE WHEN Subject='生物' THEN Score ELSE 0 END) AS "生物"

                 FROM StudentScores

                 GROUP BY UserName;

     討論:

         實現上述需求的關鍵在於,多個case whengroup by的配合使用;下面我們來

         分析下sql的執行過程:

                 我們手下看下select子句,可以確定要查詢的結果集中有5列,username、語文、數學、英

                 語、生物;拿出表中第一條記錄多數據處理得出的結果集:

                     Username          語文     數學   英語     生物

                            Nick              80            0          0            0           

                 80是由CASE WHEN Subject='語文' THEN Score ELSE 0 END得出,其他的0分別是CASE WHEN

                    Subject='數學' THEN Score ELSE 0 ENDCASE WHEN Subject='英語' THEN Score ELSE 0 END

                    CASE WHEN Subject='生物' THEN Score ELSE 0 END得出,一次類推,得到的結果集爲

                     Username          語文     數學   英語     生物

                          Nick               80       0       0         0

                          Nike               0        90      0         0

                           Nike               0        0       70        0

                           Nike                 0        0        0         85

                           Kent                 80      0        0         0

                           Kent                 0        90      0         0

                           Kent                  0        0       70        0

                           Kent                 0        0       0         85

         下一步,聚合分組,最終完成任務。

 

        令一種實現方式:

             SELECT

                   UserName,

                   sum(decode(subject,'語文',score,0)) AS "語文",

                   sum(decode(subject,'數學',score,0)) AS "數學",

                   sum(decode(subject,'英語',score,0)) AS "英語",

                   sum(decode(subject,'生物',score,0)) AS "生物"

             FROM StudentScores

             GROUP BY UserName;

 

     問題:實現列轉行

      解決:

         1、準備數據:

                 create table ScoresStudent as SELECT

                           UserName,

                           sum(decode(subject,'語文',score,0)) AS "語文",

                           sum(decode(subject,'數學',score,0)) AS "數學",

                            sum(decode(subject,'英語',score,0)) AS "英語",

                           sum(decode(subject,'生物',score,0)) AS "生物"

                 FROM StudentScores

                   GROUP BY UserName;

                 目前的數據形式:

                     

                   

                  目標數據形式:

                                         

        

             2、實現方式:

                     select username,'語文' as subject,"語文" as score from ScoresStudent

                     union

                     select username,'數學' as subject,"數學" as score from ScoresStudent

                     union

                     select username,'英語' as subject,"英語" as score from ScoresStudent

                     union

                     select username,'生物' as subject,"生物" as score from ScoresStudent;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章