亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

sql server 縱橫表的轉換

系統 2929 0

在平常的工作中或者面試中,我們可能有遇到過數據庫的縱橫表的轉換問題。今天我們就來討論下。

1.創建表

  首先我們來創建一張表。

sql語句:

      
         1
      
      
        --
      
      
        1. 創建數據表
      
      
         2
      
      
        if
      
      
        OBJECT_ID
      
      (
      
        '
      
      
        Score
      
      
        '
      
      ) 
      
        is
      
      
        not
      
      
        null
      
      
        drop
      
      
        table
      
      
         Score


      
      
         3
      
      
         4
      
      
        create
      
      
        table
      
      
         Score


      
      
         5
      
      
        (


      
      
         6
      
           姓名 
      
        nvarchar
      
      (
      
        128
      
      
        ),


      
      
         7
      
           課程 
      
        nvarchar
      
      (
      
        128
      
      
        ),


      
      
         8
      
           分數 
      
        int
      
      
         9
      
      
        )


      
      
        10
      
      
        11
      
      
        insert
      
      
        into
      
       Score 
      
        values
      
      (
      
        '
      
      
        張三
      
      
        '
      
      ,
      
        '
      
      
        語文
      
      
        '
      
      ,
      
        98
      
      
        )


      
      
        12
      
      
        insert
      
      
        into
      
       Score 
      
        values
      
      (
      
        '
      
      
        張三
      
      
        '
      
      ,
      
        '
      
      
        數學
      
      
        '
      
      ,
      
        89
      
      
        )


      
      
        13
      
      
        insert
      
      
        into
      
       Score 
      
        values
      
      (
      
        '
      
      
        張三
      
      
        '
      
      ,
      
        '
      
      
        物理
      
      
        '
      
      ,
      
        78
      
      
        )


      
      
        14
      
      
        insert
      
      
        into
      
       Score 
      
        values
      
      (
      
        '
      
      
        李四
      
      
        '
      
      ,
      
        '
      
      
        語文
      
      
        '
      
      ,
      
        79
      
      
        )


      
      
        15
      
      
        insert
      
      
        into
      
       Score 
      
        values
      
      (
      
        '
      
      
        李四
      
      
        '
      
      ,
      
        '
      
      
        數學
      
      
        '
      
      ,
      
        88
      
      
        )


      
      
        16
      
      
        insert
      
      
        into
      
       Score 
      
        values
      
      (
      
        '
      
      
        李四
      
      
        '
      
      ,
      
        '
      
      
        物理
      
      
        '
      
      ,
      
        100
      
      
        )


      
      
        17
      
      
        18
      
      
        select
      
      
        *
      
      
        from
      
       Score
    

執行結果:

sql server 縱橫表的轉換

2. 傳統的縱橫表轉換

2.1 縱表轉橫表

先看看我們要轉成的橫表張什么樣子:

既然這個表只有兩列,那么可以根據姓名進行分組。先把姓名拼湊出來,后面的分數我們再想辦法。

sql:

      
        select
      
       t.姓名 
      
        2
      
      
        from
      
       Score 
      
        as
      
       t 
      
        3
      
      
        group
      
      
        by
      
       t.姓名 
    

結果:

?

分析:

  1. 我們先拿到語文這個科目的分數。既然我們用到了group by 語句,這里肯定要用聚合函數來求分數。
  2. 而且我們只需要語文這一科的成績,分組出來的 一共有 3列 ,分別是 語文、數學、物理 ?。 ?那么就需要判斷科目來取分數。

? 這里符合我們需求的 case 語句就登場了。他和c#中switch-case 作用一樣。

sql case 語句語法:?

      
        case
      
      
         字段

    
      
      
        when
      
       值1 
      
        then
      
      
         結果

    
      
      
        when
      
       值2 
      
        then
      
      
         結果2

    ...

    
      
      
        else
      
      
         默認結果


      
      
        end
      
    

?

求語文的分數就簡單了:

      
        select
      
      
         t.姓名,


      
      
        SUM
      
      (
      
        case
      
       t.課程 
      
        when
      
      
        '
      
      
        語文
      
      
        '
      
      
        then
      
       t.分數 
      
        else
      
      
        0
      
      
        end
      
      ) 
      
        as
      
      
         語文


      
      
        from
      
       Score 
      
        as
      
      
         t


      
      
        group
      
      
        by
      
       t.姓名
    

結果:

?

既然語文的分數取到了,其他科目改變下條件就可以了。

完整的sql:

      
        select
      
      
         t.姓名,


      
      
        SUM
      
      (
      
        case
      
       t.課程 
      
        when
      
      
        '
      
      
        語文
      
      
        '
      
      
        then
      
       t.分數 
      
        else
      
      
        0
      
      
        end
      
      ) 
      
        as
      
      
         語文,


      
      
        SUM
      
      (
      
        case
      
       t.課程 
      
        when
      
      
        '
      
      
        數學
      
      
        '
      
      
        then
      
       t.分數 
      
        else
      
      
        0
      
      
        end
      
      ) 
      
        as
      
      
         數學,


      
      
        SUM
      
      (
      
        case
      
       t.課程 
      
        when
      
      
        '
      
      
        物理
      
      
        '
      
      
        then
      
       t.分數 
      
        else
      
      
        0
      
      
        end
      
      ) 
      
        as
      
      
         物理


      
      
        from
      
       Score 
      
        as
      
      
         t


      
      
        group
      
      
        by
      
       t.姓名
    

OK,到這兒,我們傳統方式的縱表轉橫表就大功告成了。

?

2.2?橫表轉縱表

那么我們可以把轉換過來的橫表再轉換回去嗎? ?

我們先把剛剛轉好的表,插入一個新表ScoreHb?中。

      
        1
      
      
        --
      
      
         轉換的表插入新表
      
      
        2
      
      
        select
      
      
         t.姓名,


      
      
        3
      
      
        SUM
      
      (
      
        case
      
       t.課程 
      
        when
      
      
        '
      
      
        語文
      
      
        '
      
      
        then
      
       t.分數 
      
        else
      
      
        0
      
      
        end
      
      ) 
      
        as
      
      
         語文,


      
      
        4
      
      
        SUM
      
      (
      
        case
      
       t.課程 
      
        when
      
      
        '
      
      
        數學
      
      
        '
      
      
        then
      
       t.分數 
      
        else
      
      
        0
      
      
        end
      
      ) 
      
        as
      
      
         數學,


      
      
        5
      
      
        SUM
      
      (
      
        case
      
       t.課程 
      
        when
      
      
        '
      
      
        物理
      
      
        '
      
      
        then
      
       t.分數 
      
        else
      
      
        0
      
      
        end
      
      ) 
      
        as
      
      
         物理


      
      
        6
      
      
        into
      
      
         ScoreHb


      
      
        7
      
      
        from
      
       Score 
      
        as
      
      
         t


      
      
        8
      
      
        group
      
      
        by
      
       t.姓名
    

這時ScoreHb 就是我們剛轉換好的橫表,我們再想辦法把他轉回來。

怎么轉呢? 一步步來。我們也先把張三和李四的語文成績查出來。

sql:

      
        1
      
      
        --
      
      
        張三李四語文的分數
      
      
        2
      
      
        select
      
      
         t.姓名,


      
      
        3
      
      
        '
      
      
        語文
      
      
        '
      
      
        as
      
      
         課程,


      
      
        4
      
       t.語文 
      
        as
      
      
         分數


      
      
        5
      
      
        from
      
       ScoreHb 
      
        as
      
       t
    

結果:

還有兩科的數據怎么辦呢? 很簡單,我們一個個都查出來,然后用 union all 把他們組合為一張表就可以了。

sql:

      
         1
      
      
        --
      
      
         union all鏈接3個科目
      
      
         2
      
      
        select
      
      
         t.姓名,


      
      
         3
      
      
        '
      
      
        語文
      
      
        '
      
      
        as
      
      
         課程,


      
      
         4
      
       t.語文 
      
        as
      
      
         分數


      
      
         5
      
      
        from
      
       ScoreHb 
      
        as
      
      
         t


      
      
         6
      
      
        union
      
      
        all
      
      
         7
      
      
        select
      
      
         t.姓名,


      
      
         8
      
      
        '
      
      
        數學
      
      
        '
      
      
        as
      
      
         課程,


      
      
         9
      
       t.數學 
      
        as
      
      
         分數


      
      
        10
      
      
        from
      
       ScoreHb 
      
        as
      
      
         t


      
      
        11
      
      
        union
      
      
        all
      
      
        12
      
      
        select
      
      
         t.姓名,


      
      
        13
      
      
        '
      
      
        物理
      
      
        '
      
      
        as
      
      
         課程,


      
      
        14
      
       t.物理 
      
        as
      
      
         分數


      
      
        15
      
      
        from
      
       ScoreHb 
      
        as
      
      
         t


      
      
        16
      
      
        order
      
      
        by
      
       t.姓名 desc
    

?

結果:

sql server 縱橫表的轉換

?

這樣,我們就把表又變回去了。

但是大家有沒有覺得很麻煩呢?別急,我們有更簡單的辦法。下面為大家介紹pivot關系運算符。

3. 用pivot和unpivot運算符進行轉換

  pivot是sql server 2005 提供的運算符,所以只要數據庫在05版本以上的都可以使用。主要用于行和列的轉換。

3.1 pivot縱表轉橫表

sql:

      
        1
      
      
        select
      
      
        2
      
      
            t2.姓名,


      
      
        3
      
      
            t2.數學,


      
      
        4
      
      
            t2.物理,


      
      
        5
      
      
            t2.語文


      
      
        6
      
      
        from
      
       Score 
      
        as
      
      
         t1


      
      
        7
      
       pivot (
      
        sum
      
      (分數) 
      
        for
      
       課程 
      
        in
      
      (數學,語文,物理)) 
      
        as
      
       t2
    

結果:

?

是不是代碼簡潔多了。

pivot將原來表中 課程字段中的 數據行 數學,語文,物理 轉換為列,并用sum取對應列的值。

我們只需要記住它的用法就可以了。

?

3.2 unpivot 橫表轉縱表

既然有privot可以縱表轉橫表。那么有沒有運算符幫我們轉回來呢?

答案是肯定的,他就是unpivot

?

sql:

      
        1
      
      
        select
      
      
        2
      
      
        *
      
      
        3
      
      
        from
      
      
        4
      
      
        ScoreHb


      
      
        5
      
       unpivot (分數 
      
        for
      
       課程 
      
        in
      
       (語文,數學,物理)) 
      
        as
      
       t4
    

結果:

sql server 縱橫表的轉換

?unpivot?將 語文,數學,物理 列轉為行,分數為新的一列存放對應的值。

?是不是比我們之前一個個表查詢拼接,方便了很多。

?

sql server 縱橫表的轉換


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久91精品久久91综合 | 免费一级毛片在线播放 | 亚洲精品123区在线观看 | 欧美91| 亚洲欧美色综合一区二区在线 | 国产视频在线观看福利 | 深夜福利院 | 日本黄 色 成 年 人免费观看 | 99久久国产综合精品2020 | 一级日本强免费 | 日韩国产成人精品视频 | chinese456老人gay chinese国产xxxx中国 | 亚洲精品啪啪一区二区三区 | 国产精品毛片久久久久久久 | 亚洲一级视频在线观看 | 天天操天天射天天舔 | 国产二区精品 | 亚洲 自拍 另类 制服在线 | 免费精品国产自产拍观看 | 日本高清一 | 日韩国产一区二区 | 天天爽夜夜爽免费看 | 伊人天天操 | 国产伊人精品 | 成年女人毛片免费播放视频m | 国产成人午夜 | 最近中文日本字幕免费完整 | 亚洲狠狠网站色噜噜 | 天天操夜夜噜 | 人成精品视频三区二区一区 | 乱子伦免费视频中文字幕 | 欧美7777 | 日本不卡视频在线 | 99久久99久久精品免费看子伦 | 尤物视频在线观看 | 国产精品100页 | 日韩欧美一区二区在线观看 | www久久久 | 99久久精品国产综合一区 | 欧美最大成人毛片视频网站 | 91精品免费国产高清在线 |