欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

玩轉-數據庫行列轉換

系統 1857 0

雖然開發過程中沒用過行列轉換,但是聽說面試時常常會遇到這個問題,以前在網上也看到過大神的例子,今天自己仔細的玩了下,希望和大家分享一下了。

注意:列轉行的方法可能是我獨創的了,呵呵,因為在網上找不到哦,全部是我自己寫的,用到了系統的SysColumns

(一)行轉列的方法

先說說行轉列的方法,這個就比較好想了,利用拼sql和case when解決即可

實現目的 玩轉-數據庫行列轉換

1:建立測試用的數據庫

    
      CREATE TABLE RowTest(

    [Name] [nvarchar](
    
    
      10
    
    ) NULL,--
    
      名稱

    [Course] [nvarchar](
    
    
      10
    
    ) NULL,--
    
      課程名稱

    [Record] [
    
    
      int
    
    ] NULL--
    
      課程的分數

)
      
2:加入測試用的數據庫(先加入整齊的數據)
        insert into RowTest values (
        
          '
        
        
          張三
        
        
          '
        
        ,
        
          '
        
        
          語文
        
        
          '
        
        ,
        
          '
        
        
          91
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          張三
        
        
          '
        
        ,
        
          '
        
        
          數學
        
        
          '
        
        ,
        
          '
        
        
          92
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          張三
        
        
          '
        
        ,
        
          '
        
        
          英語
        
        
          '
        
        ,
        
          '
        
        
          93
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          張三
        
        
          '
        
        ,
        
          '
        
        
          生物
        
        
          '
        
        ,
        
          '
        
        
          94
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          張三
        
        
          '
        
        ,
        
          '
        
        
          物理
        
        
          '
        
        ,
        
          '
        
        
          95
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          張三
        
        
          '
        
        ,
        
          '
        
        
          化學
        
        
          '
        
        ,
        
          '
        
        
          96
        
        
          '
        
        
          )



insert into RowTest values (
        
        
          '
        
        
          李四
        
        
          '
        
        ,
        
          '
        
        
          語文
        
        
          '
        
        ,
        
          '
        
        
          81
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          李四
        
        
          '
        
        ,
        
          '
        
        
          數學
        
        
          '
        
        ,
        
          '
        
        
          82
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          李四
        
        
          '
        
        ,
        
          '
        
        
          英語
        
        
          '
        
        ,
        
          '
        
        
          83
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          李四
        
        
          '
        
        ,
        
          '
        
        
          生物
        
        
          '
        
        ,
        
          '
        
        
          84
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          李四
        
        
          '
        
        ,
        
          '
        
        
          物理
        
        
          '
        
        ,
        
          '
        
        
          85
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          李四
        
        
          '
        
        ,
        
          '
        
        
          化學
        
        
          '
        
        ,
        
          '
        
        
          86
        
        
          '
        
        
          )



insert into RowTest values (
        
        
          '
        
        
          小生
        
        
          '
        
        ,
        
          '
        
        
          語文
        
        
          '
        
        ,
        
          '
        
        
          71
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          小生
        
        
          '
        
        ,
        
          '
        
        
          數學
        
        
          '
        
        ,
        
          '
        
        
          72
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          小生
        
        
          '
        
        ,
        
          '
        
        
          英語
        
        
          '
        
        ,
        
          '
        
        
          73
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          小生
        
        
          '
        
        ,
        
          '
        
        
          生物
        
        
          '
        
        ,
        
          '
        
        
          74
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          小生
        
        
          '
        
        ,
        
          '
        
        
          物理
        
        
          '
        
        ,
        
          '
        
        
          75
        
        
          '
        
        
          )

insert into RowTest values (
        
        
          '
        
        
          小生
        
        
          '
        
        ,
        
          '
        
        
          化學
        
        
          '
        
        ,
        
          '
        
        
          76
        
        
          '
        
        )
      
View Code
  

3:設計想法

? 行轉列的原理就是把行的類別找出來當做查詢的字段,利用case when 把當前的分數加到當前的字段上去,最后用group by 把數據整合在一起

4:通用方法

        
          declare
        
        
          @sql
        
        
          nvarchar
        
        (
        
          max
        
        
          )


        
        
          set
        
        
          @sql
        
        
          =
        
        
          '
        
        
          select Name
        
        
          '
        
        
          select
        
        
          @sql
        
        
          =
        
        
          @sql
        
        
          +
        
        
          '
        
        
          ,
        
        
          '
        
        
          +
        
        
          '
        
        
          isnull(max( case when Course=
        
        
          '''
        
        
          +
        
        TCourse.Course
        
          +
        
        
          '''
        
        
           then Record end ),0)
        
        
          '
        
        
          +
        
        
          TCourse.Course

 
        
        
          from
        
         (
        
          select
        
        
          distinct
        
         Course 
        
          from
        
        
           RowTest)TCourse 




        
        
          set
        
        
          @sql
        
        
          =
        
        
          @sql
        
        
          +
        
        
          '
        
        
           from RowTest group by Name order by Name
        
        
          '
        
        
          print
        
        
          @sql
        
        
          exec
        
        (
        
          @sql
        
        )
      
View Code

說明: 把所有的課程名稱取出來作為列(查詢表TCourse)

??????? 用case when 的方法把sql 拼出來

5:課外試驗

(1)加入數據

    insert into dbo.RowTest values (
    
      '
    
    
      小生
    
    
      '
    
    ,
    
      '
    
    
      生物
    
    
      '
    
    ,
    
      '
    
    
      110
    
    
      '
    
    )
    
去除max 方法會報錯,因為一條可能對應多行數據

(2)加入數據

    insert into dbo.RowTest values (
    
      '
    
    
      小生
    
    
      '
    
    ,
    
      '
    
    
      計算機
    
    
      '
    
    ,
    
      '
    
    
      110
    
    
      '
    
    )
  

數據會多出一列,但是其他人無此課程就會為0

至此,數據行轉列ok?

(二)列轉行的新方法開始了

實現目的

玩轉-數據庫行列轉換

?

1:實現原理

在網上看了別人的做法,基本都是用union all 來一個個轉換的,我覺得不太好用。

首先我想到了要把所有的列名取出來,就在網上查了下獲取表的所有列名

?然后我可以把主表和列名形成的表串起來,這樣就可以形成需要的列數,然后根據判斷取值就完成了了,呵呵

2:建立表格

        
          create
        
        
          table
        
        
           CoulumTest

(

 Name 
        
        
          nvarchar
        
        (
        
          10
        
        
          ),

 語文  
        
        
          int
        
        
          ,

 數學 
        
        
          int
        
        
          ,

 英語 
        
        
          int
        
        
          

 

)
        
      
View Code

3:加入數據

    insert into CoulumTest values(N
    
      '
    
    
      張三
    
    
      '
    
    ,
    
      90
    
    ,
    
      91
    
    ,
    
      92
    
    
      )

insert into CoulumTest values(N
    
    
      '
    
    
      李四
    
    
      '
    
    ,
    
      80
    
    ,
    
      81
    
    ,
    
      82
    
    )
    
4:經典的地方來了
        
          select
        
        
           CT.Name,Col.name 課程,

(
        
        
          case
        
        
          when
        
         Col.name
        
          =
        
        N
        
          '
        
        
          語文
        
        
          '
        
        
          then
        
         CT.語文  
        
          when
        
         Col.name
        
          =
        
        N
        
          '
        
        
          數學
        
        
          '
        
        
          then
        
        
           CT.數學

 
        
        
          when
        
         Col.name
        
          =
        
        N
        
          '
        
        
          英語
        
        
          '
        
        
          then
        
         CT.英語 
        
          end
        
         ) 
        
          as
        
         分數 
        
          from
        
        
           CoulumTest CT


        
        
          left
        
        
          join
        
         (
        
          select
        
         name 
        
          from
        
         SysColumns  
        
          Where
        
         id
        
          =
        
        
          Object_Id
        
        (
        
          '
        
        
          CoulumTest
        
        
          '
        
        )) Col 
        
          on
        
         Col.name
        
          <>
        
        
          '
        
        
          Name
        
        
          '
        
      
View Code

你沒看錯,一句話搞定,但是有個問題迷惑了我,我覺得還不夠簡化,如果可以把case when 都不用了就更好了,請大神們指點小弟一下了。怎么根據

Col的name 直接取得分數

    
      ?
    
  

玩轉-數據庫行列轉換


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品久久久久久免费软件 | 男女下面一进一出无遮挡着 | 午夜在线免费视频 | 国产精品久久久久无码av | 婷婷开心六月久久综合丁香 | 精品一卡2卡三卡4卡乱码免费 | 成人精品网 | 成人午夜视频免费 | 九九九九九热 | 国产中文一区 | 狠狠色狠狠色 | 国产午夜三级一区二区三桃花影视 | 最新久久免费视频 | 欧美高清3dfreexxxx性 | 亚洲国产日产韩国欧美综合 | 日韩一区精品 | 欧美国产一区二区 | 午夜影院毛片 | 久久丁香 | 九色视频自拍 | 99pao成人国产永久免费视频 | 久久精品亚洲成在人线av网址 | 久草在 | 日韩成人免费在线 | 国内成人啪啪网站 | 91精品国产综合久久久蜜臀粉嫩 | 亚洲日本人成中文字幕 | 欧美一区二区三区精品 | 国产一区免费 | 亚洲欧洲日产国码在线观看 | 人人爱干 | 超碰导航 | www.妞干网.com | 91av官网| 国产免费播放一区二区 | 欧美ab在线| 久久久久国产精品免费免费搜索 | 久久国产成人福利播放 | 免费成人在线网站 | 天天澡天天碰天天狠伊人五月 | 亚洲天堂久久 |