原来的数据表
<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>
请问该怎么写呢?谢谢
<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>
请问该怎么写呢?谢谢
select sum(case when [month] = '1' then datevalue else 0 end) [1月],
sum(...) [2月],
...
from tb
1月 2月 3月
15日 17 18 18.5
16日 17 18 19
而不是sum
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
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)
[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,
)
[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
pivot (sum(DataValue) for [month] in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])) p
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
这个格式对了!但是不要sum,怎么搞?
1月 2月 3月
15日 17 18 18.5
15日 17 null null
15日 18 null 18.2
16日 17 18 19
。