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

玩轉-數據庫行列轉換

系統 1788 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條評論
主站蜘蛛池模板: 亚洲在线国产 | 欧美亚洲一区二区三区在线 | 国产极品福利视频在线观看 | 欧美色综合 | 欧美一二三 | 精品国产97在线观看 | 性欧美高清久久久久久久 | 久久国产精品免费观看 | 久久久99精品久久久久久 | 九九精品视频一区在线 | 国产精品短视频 | 国色天香成人网 | 国产伦乱| 日本www在线视频 | 国产欧美精品三区 | 狠狠干奇米 | 久久九九影视 | 国外免费一级 | 成年男女免费视频网站 | 国产在热线精品视频国产一二 | 国产99在线观看 | 免费成人黄色 | 免费精品在线视频 | 国产一级影院 | 我要操影院 | 99这里只有精品视频 | 天天综合久久久网 | 日日噜噜夜夜狠狠视频无 | 亚洲日本一区二区三区在线不卡 | 欧美日韩亚 | 大伊香蕉精品视频在线天堂 | 色淫影院| 99在线观看精品 | 国产精品一国产精品免费 | 一区二区视频免费看 | 好吊妞视频在线观看 | 久久红综合久久亚洲网色 | 99精品国产第一福利网站 | 久热精品视频 | 色黄啪啪网18以下免费进 | 欧美日韩高清在线观看 |