<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 々上善若水々 閱讀(416) 評論(0)  編輯  收藏 所屬分類: 數據庫

    主站蜘蛛池模板: 免费一级毛片免费播放| 欧美日韩国产免费一区二区三区| 日韩成人在线免费视频 | 国产精品成人免费一区二区| 亚洲伊人tv综合网色| 可以免费观看的国产视频| 亚洲中久无码永久在线观看同| 手机永久免费的AV在线电影网| 久久久久国产成人精品亚洲午夜| 一级毛片免费视频网站| 亚洲午夜国产精品无码 | a在线视频免费观看在线视频三区| 亚洲精品综合久久| 久久久受www免费人成| 91禁漫免费进入| 亚洲尹人香蕉网在线视颅| 成年人网站免费视频| 亚洲AV无码无限在线观看不卡| 女人18毛片水真多免费看| 亚洲视频在线播放| www视频在线观看免费| 亚洲国产精品久久久久久| 99精品国产成人a∨免费看| 永久亚洲成a人片777777| 又黄又爽无遮挡免费视频| 边摸边吃奶边做爽免费视频99| 亚洲精品成人区在线观看| 91精品成人免费国产| 亚洲成人高清在线观看| 免费国产成人午夜电影| 国产一级在线免费观看| 亚洲精品在线播放视频| 国产在线不卡免费播放| 污污网站18禁在线永久免费观看| 亚洲噜噜噜噜噜影院在线播放| 三级网站在线免费观看| 亚洲国产成人无码av在线播放| 日本二区免费一片黄2019| baoyu777永久免费视频| 久久久国产亚洲精品| 国产亚洲精品a在线观看|