欧美三区_成人在线免费观看视频_欧美极品少妇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條評論
主站蜘蛛池模板: 国产乱码精品1区2区3区 | 亚洲精品www | 欧美精品黄页免费高清在线 | 国产精品视频播放 | 亚洲黄色免费 | 日韩欧美中 | 美女下面直流白浆视频 | 热@国产 | 免费精品久久久久久中文字幕 | 二区欧美 | 能直接看av的网站 | 欧美日韩中文在线观看 | 欧美爽爽爽高清免费视频 | 成年人xxxx| 成人激情免费视频 | 色综合久久久 | 91免费看 | 免费观看黄色a一级视频播放 | 成人中文字幕在线 | 婷婷在线五月 | 亚洲ci网 | 奇米影视四色中文字幕 | 99国产精品久久久 | 免费国产一区 | 欧美日韩视频 | 美女污污视频在线观看 | 日日夜夜精品免费视频 | 黄色网址在线播放 | 性色网址| 欧美精品久久久久久久免费观看 | 在线播放亚洲 | 黑人精品欧美一区二区蜜桃 | 成人免费一区二区三区视频网站 | 久久久久久久久久久久久久久久久久久 | 99热国产这里只有精品9九 | 国内精品久久久久久99蜜桃 | jizzjizz日本护士视频 | 亚洲国产视频在线观看 | 欧美精品一区二区三区在线 | 日韩精品久久 | 日本在线视频www鲁啊鲁 |