表结构:
PV    IP     Date
1015  100    2010-01-01  
10315 1100   2010-01-02
12015 2100   2010-01-03需要的结果:Items  2010-01-01   2010-01-02   2010-01-03  
  PV    1015        10315         12015 
  IP      100         1100          2100   
需要按日期进行查询.
请直接上SQL.. 明天上午结贴
 

解决方案 »

  1.   


    /*------------------------------------------------------------------
    --  Author : htl258(Tony)
    --  Date   : 2010-04-13 00:47:57
    --  Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
    Jul  9 2008 14:43:34 
    Copyright (c) 1988-2008 Microsoft Corporation
    Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)------------------------------------------------------------------*/
    --> 生成测试数据表:tbIF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([PV] INT,[IP] INT,[Date] varchar(10))
    INSERT [tb]
    SELECT 1015,100,N'2010-01-01' UNION ALL
    SELECT 10315,1100,N'2010-01-02' UNION ALL
    SELECT 12015,2100,N'2010-01-03'
    GO
    --SELECT * FROM [tb]-->SQL查询如下:
    declare @s varchar(8000)
    select @s=ISNULL(@s+',','')+QUOTENAME(date) from tb group by date
    exec('select * from tb unpivot(value for Items in(PV,IP)) b pivot(max(value) for Date in('+@s+'))c')
    /*
    Items 2010-01-01 2010-01-02 2010-01-03
    IP 100 1100 2100
    PV 1015 10315 12015
    */
      

  2.   

    有点看不懂你的意思,是90度行列转换吗?参考如下的存储过程.
    if exists (select * from dbo.sysobjects
    where id = object_id(N'[dbo].[p_zj]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_zj]
    GO
    /*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/create proc p_zj
           @tbname sysname, --要处理的表名
           @fdname sysname, --做为转换的列名
           @new_fdname sysname='' --为转换后的列指定列名
    as
    declare @s1 varchar(8000) , @s2 varchar(8000),
            @s3 varchar(8000) , @s4 varchar(8000),
            @s5 varchar(8000) , @i varchar(10)
    select @s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0'
    select @s1 = @s1 + ',@' + @i + ' varchar(8000)',
           @s2 = @s2 + ',@' + @i + '=''' + case isnull(@new_fdname , '') when '' then ''
           else @new_fdname + '=' end + '''''' + name + '''''''',
           @s3 = @s3 + 'select @' + @i + '=@' + @i + '+'',['' + [' + @fdname + 
           ']+'']=''+cast([' + name + '] as varchar) from [' + @tbname + ']',
           @s4 = @s4 + ',@' + @i + '=''select ''+@' + @i,
           @s5 = @s5 + '+'' union all ''+@' + @i,
           @i=cast(@i as int)+1
    from syscolumns
    where object_id(@tbname)=id and name<>@fdnameselect @s1=substring(@s1,2,8000),
           @s2=substring(@s2,2,8000),
           @s4=substring(@s4,2,8000),
           @s5=substring(@s5,16,8000)
    exec('declare ' + @s1 + 'select ' + @s2 + @s3 + 'select ' + @s4 + '
    exec(' + @s5 + ')')
    go--用上面的存储过程测试:create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
    insert Test 
    select '1月',100,200,300 union all
    select '2月',110,210,310 union all
    select '3月',120,220,320 union all
    select '4月',130,230,330
    goexec p_zj 'Test', '月份' , '项目'drop table Test
    drop proc p_zj/*
    项目   1月         2月         3月         4月          
    ---- ----------- ----------- ----------- ----------- 
    福利   200         210         220         230
    工资   100         110         120         130
    奖金   300         310         320         330(所影响的行数为 3 行)
    *//*
    静态写法(SQL2005)
    */
    --测试环境
    create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
    insert Test
    select '1月',100,200,300 union all
    select '2月',110,210,310 union all
    select '3月',120,220,320 union all
    select '4月',130,230,330
    go
    --测试语句
    SELECT * FROM 
    (
      SELECT 考核月份,月份,金额 FROM 
         (SELECT 月份, 工资, 福利, 奖金 FROM Test) p
      UNPIVOT
         (金额 FOR 考核月份 IN (工资, 福利, 奖金))AS unpvt
    ) T
    PIVOT
    (MAX(金额)  FOR 月份 in ([1月],[2月],[3月],[4月]))AS pt--测试结果/*
    考核月份  1月     2月      3月     4月
    -------  -----  -----   ------  -------
    福利200210220230
    工资100110120130
    奖金300310320330
    */--删除环境
    Drop table Test
      

  3.   

     不好意思,1楼的兄弟你的SQL可是可行,但是我想将列转为行后对Items取别名,该如何操作
    当按时间段来做这个表的汇总SQL该怎么写.unpivot和pivot从没用过这两个函数..
     谢谢.
      

  4.   

    unpivot和pivot是sql 2005的函数.
      

  5.   

    IF OBJECT_ID('[tb]') IS NOT NULL
        DROP TABLE [tb]
    GO
    CREATE TABLE [tb]([PV] INT,[IP] INT,[Date] varchar(10))
    INSERT [tb]
    SELECT 1015,100,N'2010-01-01' UNION ALL
    SELECT 10315,1100,N'2010-01-02' UNION ALL
    SELECT 12015,2100,N'2010-01-03'
    GO
    --SELECT * FROM [tb]-->SQL查询如下:
    declare @s varchar(8000)
    select @s=ISNULL(@s+',','')+QUOTENAME(date) from tb group by date
    exec('select * from tb unpivot(value for 别名 in(PV,IP)) b pivot(max(value) for Date in('+@s+'))c')
    /*
    别名 2010-01-01 2010-01-02 2010-01-03
    IP 100 1100 2100
    PV 1015 10315 120155
    */
      

  6.   

    你这帖子又给了大家一次贴代码的机会。
    http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html?30801
    还是看看精华帖吧。