我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          簡單的行列互轉(zhuǎn)問題

          --行列互轉(zhuǎn)
          /******************************************************************************************************************************************************
          以學(xué)生成績?yōu)槔樱容^形象易懂

          整理人:中國風(fēng)(Roy)

          日期:2008.06.06
          *****************************************************************************************************************************************************
          */


          --1、行互列
          --
          > --> (Roy)生成測試數(shù)據(jù)
           
          if not object_id('Class'is null
              
          drop table Class
          Go
          Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)
          Insert Class
          select N'張三',N'語文',78 union all
          select N'張三',N'數(shù)學(xué)',87 union all
          select N'張三',N'英語',82 union all
          select N'張三',N'物理',90 union all
          select N'李四',N'語文',65 union all
          select N'李四',N'數(shù)學(xué)',77 union all
          select N'李四',N'英語',65 union all
          select N'李四',N'物理',85 
          Go
          --2000方法:
          動(dòng)態(tài):

          declare @s nvarchar(4000)
          set @s=''
          Select     @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
          from Class group by[Course]
          exec('select [Student]'+@s+' from Class group by [Student]')


          生成靜態(tài):

          select 
              
          [Student],
              
          [數(shù)學(xué)]=max(case when [Course]='數(shù)學(xué)' then [Score] else 0 end),
              
          [物理]=max(case when [Course]='物理' then [Score] else 0 end),
              
          [英語]=max(case when [Course]='英語' then [Score] else 0 end),
              
          [語文]=max(case when [Course]='語文' then [Score] else 0 end
          from 
              Class 
          group by [Student]

          GO
          動(dòng)態(tài):

          declare @s nvarchar(4000)
          Select     @s=isnull(@s+',','')+quotename([Course]from Class group by[Course]
          exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')

          生成靜態(tài):
          select * 
          from 
              Class 
          pivot 
              (
          max([Score]for [Course] in([數(shù)學(xué)],[物理],[英語],[語文]))b

          生成格式:
          /*
          Student 數(shù)學(xué)          物理          英語          語文
          ------- ----------- ----------- ----------- -----------
          李四      77          85          65          65
          張三      87          90          82          78

          (2 行受影響)
          */


          ------------------------------------------------------------------------------------------
          go
          --加上總成績(學(xué)科平均分)

          --2000方法:
          動(dòng)態(tài):

          declare @s nvarchar(4000)
          set @s=''
          Select     @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
          from Class group by[Course]
          exec('select [Student]'+@s+',[總成績]=sum([Score])  from Class group by [Student]')--加多一列(學(xué)科平均分用avg([Score]))

          生成動(dòng)態(tài):

          select 
              
          [Student],
              
          [數(shù)學(xué)]=max(case when [Course]='數(shù)學(xué)' then [Score] else 0 end),
              
          [物理]=max(case when [Course]='物理' then [Score] else 0 end),
              
          [英語]=max(case when [Course]='英語' then [Score] else 0 end),
              
          [語文]=max(case when [Course]='語文' then [Score] else 0 end),
              
          [總成績]=sum([Score]--加多一列(學(xué)科平均分用avg([Score]))
          from 
              Class 
          group by [Student]

          go

          --2005方法:

          動(dòng)態(tài):

          declare @s nvarchar(4000)
          Select     @s=isnull(@s+',','')+quotename([Course]from Class group by[Course] --isnull(@s+',','') 去掉字符串@s中第一個(gè)逗號(hào)
          exec('select [Student],'+@s+',[總成績] from (select *,[總成績]=sum([Score])over(partition by [Student]) from Class) a 
          pivot (max([Score]) for [Course] in(
          '+@s+'))b ')

          生成靜態(tài):

          select 
              
          [Student],[數(shù)學(xué)],[物理],[英語],[語文],[總成績] 
          from 
              (
          select *,[總成績]=sum([Score])over(partition by [Student]from Class) a --平均分時(shí)用avg([Score])
          pivot 
              (
          max([Score]for [Course] in([數(shù)學(xué)],[物理],[英語],[語文]))b 

          生成格式:

          /*
          Student 數(shù)學(xué)          物理          英語          語文          總成績
          ------- ----------- ----------- ----------- ----------- -----------
          李四      77          85          65          65          292
          張三      87          90          82          78          337

          (2 行受影響)
          */


          go

          --2、列轉(zhuǎn)行
          --
          > --> (Roy)生成測試數(shù)據(jù)
           
          if not object_id('Class'is null
              
          drop table Class
          Go
          Create table Class([Student] nvarchar(2),[數(shù)學(xué)] int,[物理] int,[英語] int,[語文] int)
          Insert Class
          select N'李四',77,85,65,65 union all
          select N'張三',87,90,82,78
          Go

          --2000:

          動(dòng)態(tài):

          declare @s nvarchar(4000)
          select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一個(gè)union all
          +',[Score]='+quotename(Name)+' from Class'
          from syscolumns where ID=object_id('Class'and Name not in('Student')--排除不轉(zhuǎn)換的列
          order by Colid
          exec('select * from ('+@s+')t order by [Student],[Course]')--增加一個(gè)排序

          生成靜態(tài):
          select * 
          from (select [Student],[Course]='數(shù)學(xué)',[Score]=[數(shù)學(xué)] from Class union all 
          select [Student],[Course]='物理',[Score]=[物理] from Class union all 
          select [Student],[Course]='英語',[Score]=[英語] from Class union all 
          select [Student],[Course]='語文',[Score]=[語文] from Class)t 
          order by [Student],[Course]

          go
          --2005:

          動(dòng)態(tài):

          declare @s nvarchar(4000)
          select @s=isnull(@s+',','')+quotename(Name)
          from syscolumns where ID=object_id('Class'and Name not in('Student'
          order by Colid
          exec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')

          go
          select 
              Student,
          [Course],[Score] 
          from 
              Class 
          unpivot 
              (
          [Score] for [Course] in([數(shù)學(xué)],[物理],[英語],[語文]))b

          生成格式:
          /*
          Student Course Score
          ------- ------- -----------
          李四      數(shù)學(xué)      77
          李四      物理      85
          李四      英語      65
          李四      語文      65
          張三      數(shù)學(xué)      87
          張三      物理      90
          張三      英語      82
          張三      語文      78

          (8 行受影響)
          */
          原帖地址

          posted on 2008-06-23 15:08 々上善若水々 閱讀(418) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          主站蜘蛛池模板: 江北区| 江西省| 韩城市| 嵊泗县| 盱眙县| 三穗县| 长丰县| 乐安县| 新宁县| 措美县| 法库县| 黑河市| 桓台县| 都昌县| 高碑店市| 潍坊市| 大渡口区| 德保县| 宜昌市| 衢州市| 平利县| 庆云县| 长兴县| 恭城| 雅安市| 丰城市| 柏乡县| 营山县| 衡阳市| 元氏县| 乐都县| 高密市| 桐梓县| 平顺县| 新邵县| 定安县| 长寿区| 开阳县| 申扎县| 额敏县| 衡水市|