if exists(select name from sysobjects where name='test')
drop table test
go
Create table test (name char(10),km char(10),cj int)
go
insert test values('张三','语文',10)
insert test values('张三','数学',10)
insert test values('张三','英语',10)
insert test values('李四','语文',20)
insert test values('李四','数学',20)
insert test values('李四','英语',20)
declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) '+km+''
from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
exec(@sql)
print @sql@sql="select name,sum(case km when '数学      ' then cj end) 数学      ,sum(case km when '英语      ' then cj end) 英语      ,sum(case km when '语文      ' then cj end) 语文       from test group by name
"
结果如下:name       数学          英语          语文    
---------- ----------- ----------- ----------- 
李四          10          10           10          
张三          20          20           20         现在想:
name           数学          英语                     语文    
----------    -----------    -----------             ----------- 
李四          10(33.3%)    10(33.3%)           10(33.3%)          
张三          20(33.3%)    20(33.3%)           20 (33.3%)  
SQL该怎么写

解决方案 »

  1.   


    if exists(select name from sysobjects where name='test') 
    drop table test 
    go 
    Create table test (name nvarchar(10),km Nvarchar(10),cj int) 
    go 
    insert test values(N'张三',N'语文',10) 
    insert test values(N'张三',N'数学',10) insert test values(N'张三',N'英语',10) 
    insert test values(N'李四',N'语文',20) 
    insert test values(N'李四',N'数学',20) insert test values(N'李四',N'英语',20) declare @sql nvarchar(4000)
    set @sql = N'select name'
    select @sql = @sql + ',rtrim(sum(case km when N'''+km+''' then cj else 0 end))+''('''
    +'+rtrim(cast(sum(case km when N'''+km+''' then cj else 0 end)*100.0/sum(cj) as decimal(5,1)))+'')'''
    +'  as '+km+''
    from (select distinct km from test) as a
    PRINT @sql
    select @sql = @sql+N' from test group by name'
    exec(@sql)/*
    name 英语 数学 语文
    李四 20(33.3) 20(33.3) 20(33.3)
    张三 10(33.3) 10(33.3) 10(33.3)*/
      

  2.   

    if exists(select name from sysobjects where name='test')
    drop table test
    gocreate table test (name nvarchar(10),km nvarchar(10),cj int)
    go
    insert test values(N'张三',N'语文',10)
    insert test values(N'张三',N'数学',10)
    insert test values(N'张三',N'英语',10)
    insert test values(N'李四',N'语文',20)
    insert test values(N'李四',N'数学',20)
    insert test values(N'李四',N'英语',20)select name,
           max(case km when N'数学' then cj end) 数学,
           max(case km when N'英语' then cj end) 英语,
           max(case km when N'语文' then cj end) 语文 
    from(
         select name,km,
                convert(nvarchar,cj)
                +'('+convert(nvarchar,convert(decimal(5,1),100.0*cj/sum(cj)over(partition by name)))
                +'%)' as cj
         from test
        )t
    group by name