网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

行转列SQLserver

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
*
    标题:普通行列转换(version2.0)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-03-09
    地点:广东深圳
    说明:普通行列转换(version1.0)仅针对sqlserver2000提供静态和动态写法,version2.0增加sqlserver2005的有关写法。
    问题:假设有张学生成绩表(tb)如下:
    课程分数
    张三语文74
    张三数学83
    张三物理93
    李四语文74
    李四数学84
    李四物理94
    想变成(得到如下结果):
    语文数学物理
    ----------------
    李四748494
    张三748393
    -------------------
    */
    createtabletb(varchar(10),课程varchar(10),分数int)
    insertintotbvalues('张三','语文',74)
    insertintotbvalues('张三','数学',83)
    insertintotbvalues('张三','物理',93)
    insertintotbvalues('李四','语文',74)
    insertintotbvalues('李四','数学',84)
    insertintotbvalues('李四','物理',94)
    go
    --SQLSERVER2000静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
    selectas,
    max(case课程when'语文'then分数else0end)语文,
    max(case课程when'数学'then分数else0end)数学,
    max(case课程when'物理'then分数else0end)物理
    fromtb
    groupby
    --SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
    declare@sqlvarchar(8000)
    set@sql='select'
    select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'
    from(selectdistinct课程fromtb)asa
    set@sql=@sql+'fromtbgroupby'
    exec(@sql)
    --SQLSERVER2005静态SQL。
    select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b
    --SQLSERVER2005动态SQL。
    declare@sqlvarchar(8000)
    select@sql=isnull(@sql+'],[','')+课程fromtbgroupby课程
    set@sql='['+@sql+']'
    exec('select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b')
    ---------------------------------
    /*
    问题:在上述结果的基础上加平均分,总分,得到如下结果:
    语文数学物理平均分总分
    --------------------------
    李四74849484.00252
    张三74839383.33250
    */
    --SQLSERVER2000静态SQL。
    select,
    max(case课程when'语文'then分数else0end)语文,
    max(case课程when'数学'then分数else0end)数学,
    max(case课程when'物理'then分数else0end)物理,
    cast(avg(分数*1.0)asdecimal(18,2))平均分,
    sum(分数)总分
    fromtb
    groupby
    --SQLSERVER2000动态SQL。
    declare@sqlvarchar(8000)
    set@sql='select'
    select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'
    from(selectdistinct课程fromtb)asa
    set@sql=@sql+',cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby'
    exec(@sql)
    --SQLSERVER2005静态SQL。
    selectm.*,n.平均分,n.总分from
    (select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b)m,
    (select,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby)n
    wherem.=n.
    --SQLSERVER2005动态SQL。
    declare@sqlvarchar(8000)
    select@sql=isnull(@sql+',','')+课程fromtbgroupby课程
    exec('selectm.*,n.平均分,n.总分from
    (select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b)m,
    (select,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby)n
    wherem.=n.')
    droptabletb
    ------------------
    ------------------
    /*
    问题:如果上述两表互相换一下:即表结构和数据为:
    语文数学物理
    张三748393
    李四748494
    想变成(得到如下结果):
    课程分数
    ------------
    李四语文74
    李四数学84
    李四物理94
    张三语文74
    张三数学83
    张三物理93
    --------------
    */
    createtabletb(varchar(10),语文int,数学int,物理int)
    insertintotbvalues('张三',74,83,93)
    insertintotbvalues('李四',74,84,94)
    go
    --SQLSERVER2000静态SQL。
    select*from
    (
    select,课程='语文',分数=语文fromtb
    unionall
    select,课程='数学',分数=数学fromtb
    unionall
    select,课程='物理',分数=物理fromtb
    )t
    orderby,case课程when'语文'then1when'数学'then2when'物理'then3end
    --SQLSERVER2000动态SQL。
    --调用系统表动态生态。
    declare@sqlvarchar(8000)
    select@sql=isnull(@sql+'unionall','')+'select,[课程]='+quotename(Name,'''')+',[分数]='+quotename(Name)+'fromtb'
    fromsyscolumns
    wherename!=N''andID=object_id('tb')--表名tb,不包含列名为的其它列
    orderbycolidasc
    exec(@sql+'orderby')
    --SQLSERVER2005动态SQL。
    select,课程,分数fromtbunpivot(分数for课程in([语文],[数学],[物理]))t
    --SQLSERVER2005动态SQL,同SQLSERVER2000动态SQL。
    --------------------
    /*
    问题:在上述的结果上加个平均分,总分,得到如下结果:
    课程分数
    ----------------
    李四语文74.00
    李四数学84.00
    李四物理94.00
    李四平均分84.00
    李四总分252.00
    张三语文74.00
    张三数学83.00
    张三物理93.00
    张三平均分83.33
    张三总分250.00
    ------------------
    */
    select*from
    (
    selectas,课程='语文',分数=语文fromtb
    unionall
    selectas,课程='数学',分数=数学fromtb
    unionall
    selectas,课程='物理',分数=物理fromtb
    unionall
    selectas,课程='平均分',分数=cast((语文+数学+物理)*1.0/3asdecimal(18,2))fromtb
    unionall
    selectas,课程='总分',分数=语文+数学+物理fromtb
    )t
    orderby,case课程when'语文'then1when'数学'then2when'物理'then3when'平均分'then4when'总分'then5end
    droptabletb
    
  • 下一篇资讯: 结构化查询语言一
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师