<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的漫漫程序之旅

    專注于JavaWeb開發
    隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
    數據加載中……

    簡單的行列互轉問題

    --行列互轉
    /******************************************************************************************************************************************************
    以學生成績為例子,比較形象易懂

    整理人:中國風(Roy)

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


    --1、行互列
    --
    > --> (Roy)生成測試數據
     
    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'數學',87 union all
    select N'張三',N'英語',82 union all
    select N'張三',N'物理',90 union all
    select N'李四',N'語文',65 union all
    select N'李四',N'數學',77 union all
    select N'李四',N'英語',65 union all
    select N'李四',N'物理',85 
    Go
    --2000方法:
    動態:

    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]')


    生成靜態:

    select 
        
    [Student],
        
    [數學]=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),
        
    [語文]=max(case when [Course]='語文' then [Score] else 0 end
    from 
        Class 
    group by [Student]

    GO
    動態:

    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')

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

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

    (2 行受影響)
    */


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

    --2000方法:
    動態:

    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]')--加多一列(學科平均分用avg([Score]))

    生成動態:

    select 
        
    [Student],
        
    [數學]=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),
        
    [語文]=max(case when [Course]='語文' then [Score] else 0 end),
        
    [總成績]=sum([Score]--加多一列(學科平均分用avg([Score]))
    from 
        Class 
    group by [Student]

    go

    --2005方法:

    動態:

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

    生成靜態:

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

    生成格式:

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

    (2 行受影響)
    */


    go

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

    --2000:

    動態:

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

    生成靜態:
    select * 
    from (select [Student],[Course]='數學',[Score]=[數學] 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:

    動態:

    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([數學],[物理],[英語],[語文]))b

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

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

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

    主站蜘蛛池模板: 亚洲成A∨人片在线观看不卡| 亚洲午夜国产片在线观看| 国产又粗又长又硬免费视频| 亚洲一区在线视频观看| 最新黄色免费网站| 亚洲日本国产精华液| 1000部夫妻午夜免费| 亚洲二区在线视频| 毛片免费视频观看| 亚洲综合精品成人| 亚洲中文字幕一区精品自拍| 成在人线AV无码免费| 亚洲欧美日韩综合俺去了| 日本一道高清不卡免费| 一级做性色a爰片久久毛片免费| 亚洲五月丁香综合视频| 久9热免费精品视频在线观看| 浮力影院第一页小视频国产在线观看免费| 国产yw855.c免费视频| 黄色免费在线观看网址| 亚洲中文字幕无码久久2017| 国产麻豆一精品一AV一免费| 亚洲精品美女在线观看播放| 久久受www免费人成_看片中文| 久久久青草青青国产亚洲免观| 亚洲视频一区在线观看| 毛片a级毛片免费播放下载| 成人亚洲国产精品久久| 国产性爱在线观看亚洲黄色一级片 | 亚洲精品无码永久在线观看| 国产特黄一级一片免费| 亚洲啪啪免费视频| 成人免费毛片观看| 久久性生大片免费观看性| 中文字幕在线观看亚洲| 国产免费观看黄AV片| 暖暖免费在线中文日本| 亚洲色精品三区二区一区| 亚洲午夜久久久久久久久久 | 亚洲大尺度无码专区尤物| 18禁网站免费无遮挡无码中文|