原来的数据表
<table>
<tr><td>DataValue</td><td>Year</td><td>Month</td><td>Day</td></tr>
<tr><td>17.00</td><td>2011</td><td>1</td><td>15</td></tr>
<tr><td>18.00</td><td>2011</td><td>2</td><td>15</td></tr>
<tr><td>18.50</td><td>2011</td><td>3</td><td>15</td></tr>
</table>
现在要像这样显示:
<table>
<tr><td></td><td>1月</td><td>2月</td><td>3月</td></tr>
<tr><td>15</td><td>17</td><td>18</td><td>18.5</td></tr>
</table>
请问该怎么写呢?谢谢

解决方案 »

  1.   


    select sum(case when [month] = '1' then datevalue else 0 end) [1月],
           sum(...) [2月],
           ...
    from tb
      

  2.   

    结果应该是这样:
         1月  2月  3月
    15日 17   18   18.5
    16日 17   18   19
    而不是sum
      

  3.   

    select * from (
    select date,darevalue,month from tb unpivot(datevalue for date in([15日],[16日]))v )a 
    pivot (sum(DataValue) for month in ([1月],[2月],[3月])) p
      

  4.   

    表为:
    id 记录1 记录2 记录3 日期
    1 80 75 82 2008-01-01
    2 82 76 85 2008-01-02
    3 88 85 85 2008-01-03
    查询结果为:
    名称 2008-01-01 2008-01-02 2008-01-03
    记录1 80         82         88
    记录2 75         76         85
    记录3 82         85         85
    go
    create table t
    (
    id int,
    记录1 varchar(10),
    记录2 varchar(10),
    记录3 varchar(10),
    日期 date)
    go
    insert into t 
    select '1','80','75','82','2008-1-1'
    union all 
    select '2','82','76','85','2008-1-2'
    union all 
    select '3','88','85','85','2008-1-3'
    select *  from t
    go
    --实现语句
    方法一:
    select * from 
    (select 名称,内容,日期 from t unpivot (内容 for 名称 in(记录1,记录2,记录3)) p) m
     pivot (max(内容) for 日期 in([2008-01-01],[2008-01-02],[2008-01-03])) a
    方法二:动态语句拼接
    declare @s varchar(max)
    declare @t varchar(max)
    declare @str varchar(max)
    set @s=stuff((select ',['+convert(varchar(10),日期)+']' from t for xml path('')),1,1,'')
    set @t=STUFF((select ','+name from syscolumns where id=OBJECT_ID('t') and name not in('id','日期') for XML path('')),1,1,'')
    set @str='select * from 
    (select  名称,内容,日期 from t unpivot (内容 for 名称 in('+@t+')) p) m
     pivot (max(内容) for 日期 in('+@s+')) a'
    exec(@str)
      

  5.   

    这是数据表的结构CREATE TABLE [dbo].[TbData](
    [DataID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [DataValue] [numeric](18, 6) NOT NULL,
    [Year] [smallint] NOT NULL,
    [Month] [smallint] NOT NULL,
    [Day] [smallint] NOT NULL,
    )
      

  6.   

    其实就像Calendar一样显示数据,每月每天只有一个值,你这样会有多个值
      

  7.   

    CREATE TABLE [dbo].[TbData](
        [DataID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
        [DataValue] [numeric](18, 6) NOT NULL,
        [Year] [smallint] NOT NULL,
        [Month] [smallint] NOT NULL,
        [Day] [smallint] NOT NULL,
    )
    insert into [TbData]([DataValue],[Year],[Month],[Day]) 
    select '17.00','2011','1','15'
    union all select '18.00','2011','2','15'
    union all select '18.50','2011','3','16'
    union all select '18.00','2011','4','16'
    select * from (select day,Month,DataValue from [TbData]) a  
    pivot (sum(DataValue) for [month] in ([1],[2],[3])) p
    结果为:
    day 1 2 3
    15 17.000000 18.000000 NULL
    16 NULL NULL 18.500000
      

  8.   

    select * from (select day,Month,DataValue from [TbData]) a  
    pivot (sum(DataValue) for [month] in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) p
      

  9.   

    select * from (select day,month=cast(Month as varchar(10))+'月',DataValue from [TbData]) a  
    pivot (sum(DataValue) for [month] in ([1月],[2月],[3月],[4月],[5月],[6月],[7月],[8月],[9月],[10月],[11月],[12月])) p
    结果
    day 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
    15 17.000000 18.000000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
    16 NULL NULL 18.500000 18.000000 NULL NULL NULL NULL NULL NULL NULL NULL
      

  10.   


    这个格式对了!但是不要sum,怎么搞?
      

  11.   

    按你给的格式,同一天的数据也是要求和的,如果同一天的数据部求和,就有可能是类似下面这样的数据时你要的吗?
      1月 2月 3月
    15日 17 18 18.5
    15日 17 null null
    15日 18 null 18.2
    16日 17 18 19
      

  12.   

    可以为null的,只是按月日来显示数据而已,没有就null