表A 如下:商品名称   日期             销量
  A       2006-11-20         100
  A       2006-11-21         110
  A       2006-11-27         222
  B       2006-11-22         110
  B       2006-11-24         170
  C       2006-11-15         160
  C       2006-11-26         330
 ...          ...            ...
求格式如下:
商品名称   2006-11-15    2006-11-16  ......  2006-11-27    日平均
   A                                       222        
   B                         
   C         160                       

解决方案 »

  1.   

    普通行列转换假设有张学生成绩表(t)如下    Name Subject Result
        张三 语文  73
        张三 数学  83
        张三 物理  93
        李四 语文  74
        李四 数学  84
        李四 物理  94    想变成 
        姓名 语文 数学 物理
        张三 73  83  93
        李四 74  84  94    create table #t
        (
        Name    varchar(10) ,
        Subject varchar(10) ,
        Result  int
        )    insert into #t(Name , Subject , Result) values('张三','语文','73')
        insert into #t(Name , Subject , Result) values('张三','数学','83')
        insert into #t(Name , Subject , Result) values('张三','物理','93')
        insert into #t(Name , Subject , Result) values('李四','语文','74')
        insert into #t(Name , Subject , Result) values('李四','数学','83')
        insert into #t(Name , Subject , Result) values('李四','物理','93')    declare @sql varchar(8000)
        set @sql = 'select Name as ' + '姓名'
        select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']'
        from (select distinct Subject from #t) as a
        set @sql = @sql + ' from #t group by name'
        exec(@sql)     drop table #t    --结果
        姓名       数学        物理        语文          
        ---------- ----------- ----------- ----------- 
        李四       83          93          74
        张三       83          93          73
     如果上述两表互相换一下:即    姓名 语文 数学 物理
        张三 73  83  93
        李四 74  84  94    想变成     Name Subject Result
        张三 语文  73
        张三 数学  83
        张三 物理  93
        李四 语文  74
        李四 数学  84
        李四 物理  94    create table #t
        (
        姓名 varchar(10) ,
        语文 int ,
        数学 int ,
        物理 int
        )    insert into #t(姓名 , 语文 , 数学 , 物理) values('张三',73,83,93)
        insert into #t(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)    select 姓名 as Name,'语文' as Subject,语文 as Result from #t union
        select 姓名 as Name,'数学' as Subject,数学 as Result from #t union
        select 姓名 as Name,'物理' as Subject,物理 as Result from #t
        order by 姓名 desc     drop table #t
     
        Name       Subject Result      
        ---------- ------- ----------- 
        张三       数学    83
        张三       物理    93
        张三       语文    73
        李四       数学    84
        李四       物理    94
        李四       语文    74    (所影响的行数为 6 行)
      

  2.   

    declare @sql varchar(8000)
    set @sql=''select @sql=@sql+',['+日期+']='sum(case 日期 when '''+日期+''' then 销量 else 0 end)'  
    from (select distinct convert(char(10),日期,120) as 日期 from 表A) tset @sql='select 商品名称'+@sql+',日平均=avg(销量) from 表A group by 商品名称'exec(@sql)
      

  3.   

    SQL Server 的每个数据库最多可存储 20 亿个表,每个表可以有 1024 列。
      

  4.   

    create table test(商品名称 varchar(6),日期 datetime,销量 int)
    insert into test select 'A','2006-11-20',100
    insert into test select 'A','2006-11-21',110
    insert into test select 'A','2006-11-27',222
    insert into test select 'B','2006-11-22',110
    insert into test select 'B','2006-11-24',170
    insert into test select 'C','2006-11-15',160
    insert into test select 'C','2006-11-26',330
    go
       
    declare @sql varchar(8000)
    set @sql=''select @sql=@sql+',['+日期+']=sum(case 日期 when '''+日期+''' then 销量 else 0 end)'  
    from (select distinct convert(char(10),日期,120) as 日期 from test) tset @sql='select 商品名称'+@sql+',日平均=avg(销量) from test group by 商品名称'exec(@sql)
    go/*
    商品名称  2006-11-15  2006-11-20  2006-11-21  2006-11-22  2006-11-24  2006-11-26  2006-11-27  日平均         
    ------   ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    A        0           100         110         0           0           0           222         144
    B        0           0           0           110         170         0           0           140
    C        160         0           0           0           0           330         0           245
    */drop table test
    go
      

  5.   

    棒场,这样的语句成了csdn上抢答题,哈哈
      

  6.   

    交叉表问题,不能简单就求出,SQL SERVER有最高列限制,没有绝对的答案
      

  7.   

    if object_id('pubs..tb') is not null
       drop table tb
    gocreate table tb
    (
    商品名称 char(1),  
    日期     char(10),        
    销量     int
    )insert into tb(商品名称,日期,销量) values('A','2006-11-20',100)
    insert into tb(商品名称,日期,销量) values('A','2006-11-21',110)
    insert into tb(商品名称,日期,销量) values('A','2006-11-27',222)
    insert into tb(商品名称,日期,销量) values('B','2006-11-22',110)
    insert into tb(商品名称,日期,销量) values('B','2006-11-24',170)
    insert into tb(商品名称,日期,销量) values('C','2006-11-15',160)
    insert into tb(商品名称,日期,销量) values('C','2006-11-26',330)declare @sql varchar(8000)
    set @sql = ''
    select @sql = @sql + ' , max(case 日期 when ''' + 日期 + ''' then 销量 else 0 end) [' + 日期 + ']'
    from (select distinct 日期 from tb) as a
    set @sql = 'select m.* , n.日平均 from ' +
               '(select 商品名称' + @sql + ' from tb group by 商品名称) m , '+
               '(select 商品名称 , sum(销量)/count(*) as 日平均 from tb group by 商品名称) n ' +
               'where m.商品名称 = n.商品名称'
    exec(@sql) drop table tb商品名称 2006-11-15 2006-11-20 2006-11-21 2006-11-22 2006-11-24 2006-11-26 2006-11-27 日平均
    -------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------
    A        0          100        110        0          0          0          222        144
    B        0          0          0          110        170        0          0          140
    C        160        0          0          0          0          330        0          245
      

  8.   

    上面的时间类型是字符串型,下面用的是datetime型.if object_id('pubs..tb') is not null
       drop table tb
    gocreate table tb
    (
    商品名称 char(1),  
    日期     datetime,        
    销量     int
    )insert into tb(商品名称,日期,销量) values('A','2006-11-20',100)
    insert into tb(商品名称,日期,销量) values('A','2006-11-21',110)
    insert into tb(商品名称,日期,销量) values('A','2006-11-27',222)
    insert into tb(商品名称,日期,销量) values('B','2006-11-22',110)
    insert into tb(商品名称,日期,销量) values('B','2006-11-24',170)
    insert into tb(商品名称,日期,销量) values('C','2006-11-15',160)
    insert into tb(商品名称,日期,销量) values('C','2006-11-26',330)declare @sql varchar(8000)
    set @sql = ''
    select @sql = @sql + ' , max(case convert(varchar(10),日期,120) when ''' + convert(varchar(10),日期,120) + ''' then 销量 else 0 end) [' + convert(varchar(10),日期,120) + ']'
    from (select distinct 日期 from tb) as a
    set @sql = 'select m.* , n.日平均 from ' +
               '(select 商品名称' + @sql + ' from tb group by 商品名称) m , '+
               '(select 商品名称 , sum(销量)/count(*) as 日平均 from tb group by 商品名称) n ' +
               'where m.商品名称 = n.商品名称'
    exec(@sql) drop table tb商品名称 2006-11-15 2006-11-20 2006-11-21 2006-11-22 2006-11-24 2006-11-26 2006-11-27 日平均
    -------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------
    A        0          100        110        0          0          0          222        144
    B        0          0          0          110        170        0          0          140
    C        160        0          0          0          0          330        0          245
      

  9.   

    create table A(PdtName char(1), Date datetime, Sales int)
    insert A select   'A',       '2006-11-20',         100
    union all select   'A',       '2006-11-21',        110
    union all select   'A',       '2006-11-27',         222
    union all select   'B',       '2006-11-22',         110
    union all select   'B',       '2006-11-24',         170
    union all select   'C',       '2006-11-15',         160
    union all select   'C',       '2006-11-26',         330declare @sql nvarchar(4000)
    set @sql='select PdtName, '
    select @sql=@sql+quotename(convert(char(10), Date, 120))+'=sum(case when Date='+quotename(Date, '''')+' then Sales else 0 end), ' from A group by Date
    select @sql=left(@sql, len(@sql)-1), @sql=@sql+' from A group by PdtName '
    exec(@sql)
    --result
    PdtName 2006-11-15  2006-11-20  2006-11-21  2006-11-22  2006-11-24  2006-11-26  2006-11-27  
    ------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    A       0           100         110         0           0           0           222
    B       0           0           0           110         170         0           0
    C       160         0           0           0           0           330         0
      

  10.   

    try:if exists (select 1 from sysobjects  where name =  't_Test' and type = 'U')
    drop table t_testcreate table t_test
    (sale_name varchar(20),
     date      datetime,
     sale_qty  int)insert into t_Test
    select  'A',      '2006-11-20',         100 union
    select  'A',      '2006-11-21',         110 union
    select  'A',      '2006-11-27',         222 union
    select  'B',      '2006-11-22',         110 union
    select  'B',      '2006-11-24',         170 union
    select  'C',      '2006-11-15',         160 union
    select  'C',      '2006-11-26',         330 select * from t_testdeclare @sql varchar(8000)
    set @sql = ''
    select @sql = @sql + ',min(case  when  date = cast( ''' +   convert(varchar(10) , date , 121 )+ ''' as datetime) then sale_qty end ) as ''' + convert(varchar(10) , date , 121 ) + ''''
    from   t_test
    group  by dateselect @sql = 'select sale_name ' + @sql + ' from t_test group by sale_name'
    print @sql
    exec( @sql)drop table t_test
      

  11.   

    要顶!
    -----------------------------------IT者--IT开发者的网站 
      www.itzhe.cn