zoukankan      html  css  js  c++  java
  • SQL面试题之行列转换

    行列转换--普通
     
    假设有张学生成绩表(CJ)如下
    Name Subject Result
    张三 语文 80
    张三 数学 90
    张三 物理 85
    李四 语文 85
    李四 数学 92
    李四 物理 82
     
    想变成
    姓名 语文 数学 物理
    张三 80 90 85
    李四 85 92 82
     

    1. declare @sql varchar(4000)  
    2. set @sql = 'select Name'  
    3. select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'  
    4. from (select distinct Subject from CJ) as a  
    5. select @sql = @sql+' from test group by name'  
    6. exec(@sql)  
    declare @sql varchar(4000)
    set @sql = 'select Name'
    select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
    from (select distinct Subject from CJ) as a
    select @sql = @sql+' from test group by name'
    exec(@sql)


     


    行列转换--合并
     
    有表A,
    id pid
    1 1
    1 2
    1 3
    2 1
    2 2
    3 1
    如何化成表B:
    id pid
    1 1,2,3
    2 1,2
    3 1
     
    创建一个合并的函数

    1. create function fmerg(@id int)  
    2. returns varchar(8000)  
    3. as  
    4. begin  
    5. declare @str varchar(8000)  
    6. set @str=''  
    7. select @str=@str+','+cast(pid as varcharfrom 表A where id=@id  
    8. set @str=right(@str,len(@str)-1)  
    9. return(@str)  
    10. End  
    11. go  
    12.    
    create function fmerg(@id int)
    returns varchar(8000)
    as
    begin
    declare @str varchar(8000)
    set @str=''
    select @str=@str+','+cast(pid as varchar) from 表A where id=@id
    set @str=right(@str,len(@str)-1)
    return(@str)
    End
    go
     
    
  • 相关阅读:
    迭代合并排序算法
    appendChild和insertBefore的区别
    使用定时器处理数组
    正则表达式 删除string首尾的空白
    图片滚动
    数组合并法(IE7性能优化)
    赋值取值+arguments
    条件预加载(conditional advanceloading)
    Just a Note~
    腾讯马拉松复赛第一场
  • 原文地址:https://www.cnblogs.com/gxpblogs/p/3068875.html
Copyright © 2011-2022 走看看