2006-07-26 4    401                  全清真                              719.90
2006-07-26 4    402                  郭家军                              974.50
2006-07-26 4    403                  单岩斌                              1139.50
2006-07-26 4    404                  李绍琨                              1492.10
2006-07-26 4    405                  李春光                              1717.80
2006-07-26 4    406                  徐德林                              1345.90
2006-07-26 4    407                  王毅                               1564.80
2006-07-26 4    408                  华德峰                              1314.90
2006-07-26 4    409                  张义波                              1392.70
2006-07-26 4    410                  关龙国                              1489.80
2006-07-26 4    411                  曲连言                              802.50
2006-07-26 4    412                  崔玉君                              1376.50
2006-07-26 4    413                  王洪海                              1439.70
2006-07-26 4    414                  肖云飞                              1169.50
2006-07-26 4    415                  刘德江                              1403.60
2006-07-26 4    416                  张保全                              1087.50
2006-07-26 4    417                  殷继明                              1301.70
2006-07-26 4    418                  孙茂辉                              1379.50
2006-07-26 4    419                  马永刚                              1099.50
2006-07-26 4    420                  尹作维                              1353.80
2006-07-26 4    421                  周国明                              1193.80
2006-07-26 4    422                  王格                               1085.50
2006-07-26 4    423                  崔玉强                              916.90
2006-07-26 4    424                  董承波                              1124.70
2006-07-26 4    425                  刘万世                              1619.30
2006-07-26 4    426                  丁国虎        姜洋                    1397.20
2006-07-26 6    601                  孔庆武                              815.70
2006-07-26 6    602                  曹成辉                              702.50
2006-07-26 6    603                  于德胜        孙安玉                   730.10
2006-07-26 6    604                  梁萌         王永斌                   851.40
2006-07-26 6    605                  王东旭        侯秉志                   887.20
2006-07-26 6    606                  焉德财                              808.70
2006-07-26 6    607                  王刚                               946.40
2006-07-26 6    608                  林世梵                              .00
2006-07-26 6    609                  王景峰                              798.70
2006-07-26 6    610                  蔡源禄                              904.70
2006-07-26 6    611                  杜福利                              742.10
2006-07-26 6    612                  王晓明                              645.30
2006-07-26 6    613                  佟宝贵                              882.20
2006-07-26 6    614                  靳文凯                              224.00
2006-07-26 6    615                  林景奎                              817.00
2006-07-26 6    616                  陈立滨                              785.50
2006-07-26 7    701                  鞠彬                               841.50
2006-07-26 7    702                  杜洪晨                              680.10
2006-07-26 7    703                  王东                               1048.80
2006-07-26 7    704                  张家君                              875.50
2006-07-26 7    705                  王国峰                              1256.30
2006-07-26 7    706                  江世纪        程宪锋                   779.30
2006-07-26 7    707                  白风林                              973.60
2006-07-26 7    708                  柯永军                              1082.70
2006-07-26 7    709                  王洪波                              1202.40
2006-07-26 7    710                  常贵彬                              1009.30
2006-07-26 7    711                  刘宇帅                              670.80
2006-07-26 7    712                  杨铭枝                              1111.30
2006-07-26 7    713                  隋艳波        徐卫东                   1047.30
2006-07-26 7    714                  王成福                              879.60
2006-07-26 7    715                  董长河                              922.60
2006-07-26 7    716                  孙洪国        杨渤                    966.00
2006-07-26 7    717                  宋元锋                              649.50
2006-07-26 7    718                  许明                               1015.20
2006-07-26 7    719                  于祥升                              773.20
2006-07-26 7    720                  陶增义                              1014.90
2006-07-26 7    721                  王杰                               1009.60
2006-07-26 7    722                  孔繁田                              1072.90
2006-07-27 1    101                  宋平         高涛                    532.00
2006-07-27 1    102                  王庆斌                              589.50
2006-07-27 1    103                  刘春刚                              593.60
2006-07-27 1    104                  李鹏                               757.30
2006-07-27 1    105                  王庆                               .00
2006-07-27 1    106                  田俊林                              582.30
2006-07-27 1    107                  赵春辉                              650.50
2006-07-27 1    108                  郑福金                              647.60
2006-07-27 1    109                  张佑锋                              672.00
......
现在想列出如下的两种格式应该如何实现呢?格式一 :
1路;
    日期     101 102 103 104 ..... 118
2006-07-26   yye yye yye yye ......
2006-07-27   yye yye yye yye ......
...
2006-08-25   yye yye yye yye ......3路4路6路7路与1路格式相同,每次只列出一路就可以了。xl里只有1,3,4,6,7这几路数据。格式二:
1路日期        董克卫 高宏林 高涛 ...... 郑福金
2006-07-26   yye    yye    yye  yye ......
2006-07-27   yye    yye    yye  yye ......
...
2006-08-25   yye    yye    yye  yye ......
其他路与1路显示格式相同。
请教各位大虾怎么实现?

解决方案 »

  1.   

    SQL语句之普通行列转换 
     
    假设有张学生成绩表(tb_rowtocol)如下
    Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94想变成 
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94declare @sql varchar(4000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
    from (select distinct Subject from rowtocol) as a
    set @sql = @sql + ' from rowtocol group by name'
    exec(@sql) 
     
    如果上述两表互相换一下:即
    表名(cj)
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94想变成 Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94select 姓名 as Name,'语文' as Subject,语文 as Result from CJ union
    select 姓名 as Name,'数学' as Subject,数学 as Result from CJ union
    select 姓名 as Name,'物理' as Subject,物理 as Result from CJ
    order by 姓名 desc 
     
      

  2.   

    SQL语句之合并行列转换 
     
      有表rowtocol,其数据如下:
      a b
      1 1
      1 2
      1 3
      2 1
      2 2
      3 1
      如何转换成如下结果:
      a b
      1 1,2,3
      2 1,2
      3 1   创建一个合并的函数      create function f_rowtocol(@a int)
      returns varchar(8000)
      as
      begin
       declare @str varchar(8000)
       set @str = ''
       select @str = @str + ',' + cast(b as varchar) from rowtocol where a = @a 
       set @str = right(@str , len(@str) - 1)
       return(@str)
      End
      go
      调用自定义函数得到结果:
      select distinct a ,dbo.f_rowtocol(a) from rowtocol 
     
      

  3.   

    行列转换加合计 
     
    例如有表A某些人每月消费数据如下:
    id data month
    001 11 1
    001 12 2
    001 13 3
    001 14 4
    001 15 5
    001 16 6
    001 17 7
    001 18 8
    001 19 9
    001 110 10
    001 111 11
    001 112 12
    002 21 1
    002 22 2
    002 23 3
    002 24 4
    002 25 5
    002 26 6
    002 27 7
    002 28 8
    002 29 9
    002 210 10
    002 211 11
    002 212 12
    要实现如下结果:   
     
    第一个: SELECT id as '人员' , 
    SUM(CASE month WHEN 1 THEN data ELSE 0 END) AS '1月' ,
    SUM(CASE month WHEN 2 THEN data ELSE 0 END) AS '2月' ,
    SUM(CASE month WHEN 3 THEN data ELSE 0 END) AS '3月' ,
    SUM(CASE month WHEN 4 THEN data ELSE 0 END) AS '4月' ,
    SUM(CASE month WHEN 5 THEN data ELSE 0 END) AS '5月' ,
    SUM(CASE month WHEN 6 THEN data ELSE 0 END) AS '6月' ,
    SUM(CASE month WHEN 7 THEN data ELSE 0 END) AS '7月' ,
    SUM(CASE month WHEN 8 THEN data ELSE 0 END) AS '8月' ,
    SUM(CASE month WHEN 9 THEN data ELSE 0 END) AS '9月' ,
    SUM(CASE month WHEN 10 THEN data ELSE 0 END) AS '10月' ,
    SUM(CASE month WHEN 11 THEN data ELSE 0 END) AS '11月' ,
    SUM(CASE month WHEN 12 THEN data ELSE 0 END) AS '12月' 
    FROM a
    GROUP BY ID 
     
    第二个: SELECT id as '人员' , 
    SUM(CASE month WHEN 1 THEN data ELSE 0 END) AS '1月' ,
    SUM(CASE month WHEN 2 THEN data ELSE 0 END) AS '2月' ,
    SUM(CASE month WHEN 3 THEN data ELSE 0 END) AS '3月' ,
    SUM(CASE month WHEN 4 THEN data ELSE 0 END) AS '4月' ,
    SUM(CASE month WHEN 5 THEN data ELSE 0 END) AS '5月' ,
    SUM(CASE month WHEN 6 THEN data ELSE 0 END) AS '6月' ,
    SUM(CASE month WHEN 7 THEN data ELSE 0 END) AS '7月' ,
    SUM(CASE month WHEN 8 THEN data ELSE 0 END) AS '8月' ,
    SUM(CASE month WHEN 9 THEN data ELSE 0 END) AS '9月' ,
    SUM(CASE month WHEN 10 THEN data ELSE 0 END) AS '10月' ,
    SUM(CASE month WHEN 11 THEN data ELSE 0 END) AS '11月' ,
    SUM(CASE month WHEN 12 THEN data ELSE 0 END) AS '12月' ,
    SUM(data) as '合计'
    FROM a
    GROUP BY ID 
     
      

  4.   

    看来,高手们都去过周末了,我的问题恐怕要不好解决了。
    declare @sql varchar(4000)
    declare @xl varchar(1)
    declare @rq_s varchar(10)
    declare @rq_e varchar(10) 
    set @xl='4'
    set @rq_s='2006-07-26'
    set @rq_e='2006-08-25'
    set @sql = 'select rq as ' + 'rq'
    select @sql = @sql + ' , sum(case yyhm when '''+yyhm+''' then yhck end) ['+yyhm+']'
    from (select distinct yyhm from yy_ryye where xl=@xl and substring(yyhm,1,1)=@xl) as a
    set @sql = @sql + ' from yy_ryye where rq>='''+@rq_s+'''and rq<='''+@rq_e+ '''group by rq order by rq'
    exec(@sql) 
    我的数据没有按yyhm的顺序排序,为什么呢?
    我想把其中的一条语句写成这样,但是有错误,不知道应该怎么写呢?
    (select distinct yyhm from yy_ryye where xl=@xl and substring(yyhm,1,1)=@xl)
    改成:
    (select distinct yyhm from yy_ryye where xl=@xl and substring(yyhm,1,1)=@xl order by yyhm)
    出现如下错误:
    服务器: 消息 1033,级别 15,状态 1,行 10
    除非同时指定了 TOP,否则 ORDER BY 子句在视图、内嵌函数、派生表和子查询中无效。
      

  5.   

    写出来了
    declare @sql varchar(4000)
    declare @xl varchar(1)
    declare @rq_s varchar(10)
    declare @rq_e varchar(10) 
    set @xl='4'
    set @rq_s='2006-07-26'
    set @rq_e='2006-08-25'
    set @sql = 'select rq as ' + 'rq'
    select @sql = @sql + ' , sum(case yyhm when '''+yyhm+''' then yhck end) ['+yyhm+']'
    from (select distinct yyhm from yy_ryye where xl=@xl and substring(yyhm,1,1)=@xl) as a order by yyhm
    set @sql = @sql + ' from yy_ryye where rq>='''+@rq_s+'''and rq<='''+@rq_e+ '''group by rq order by rq'
    exec(@sql) 
      

  6.   

    declare @sql varchar(4000)
    declare @xl varchar(1)
    declare @rq_s varchar(10)
    declare @rq_e varchar(10) 
    set @xl='6'
    set @rq_s='2006-07-26'
    set @rq_e='2006-08-25'set @sql = 'select xl as '+'xl,'+'jsy1 as ' + 'jsy1'
    select @sql = @sql + ' , sum(case convert(varchar(10),rq,120) when '''+convert(varchar(10),rq,120)+''' then yhck else 0 end) ['+convert(varchar(2),day(rq))+']'
    from (select distinct rq from yy_ryye where rq>=@rq_s and rq<=@rq_e) as a order by rq
    set @sql = @sql + ' from yy_ryye where rq>='''+@rq_s+'''and rq<='''+@rq_e+ '''group by xl,jsy1 order by xl,jsy1'
    exec(@sql) 
    以上这条可以改成一条SQL语句吗?
      

  7.   

    以上你可以改成一个存储过程,返回的也时候一个记录集
    vb里面要 rs绑定就可以了..
    .net 就要ds绑定
      

  8.   

    谢谢xiaoku,但是我想将数据传到临时表中,然后再做一些处理,就不知道如何处理了?
      

  9.   

    现在我如何将列出的数据传送到临时表中呢?
    select .... into 临时表
    然后再对临时表处理
      

  10.   

    谢谢xyxfly(小虾米 ^0^ 至今思项羽,不肯过江东.) 
    可是我写成了这样但是没有发现临时表为什么呢?
    declare @sql varchar(4000)
    declare @xl varchar(1)
    declare @rq_s varchar(10)
    declare @rq_e varchar(10) 
    set @xl='6'
    set @rq_s='2006/07/26'
    set @rq_e='2006/08/25'set @sql = 'select xl,jsy1,yyhm'
    select @sql = @sql + ' , sum(case convert(varchar(10),rq,120) when '''+convert(varchar(10),rq,120)+''' then yhck else 0 end) ['+convert(varchar(2),day(rq))+']'
     from (select distinct rq from yy_ryye where rq>=@rq_s and rq<=@rq_e) as a order by rq
    set @sql = @sql + 'into #temp from yy_ryye where rq>='''+@rq_s+'''and rq<='''+@rq_e+ '''group by xl,jsy1,yyhm order by xl,jsy1,yyhm'
    print @sql
    exec(@sql) 但是未传入临时表呢?
      

  11.   

    找到答案了
    臨時表有作用域的,這個臨時表只在EXEC內部有效,改用全局臨時表。
      

  12.   

    EXEC
    因为exec运行时另外开辟一块内存空间