基于下表
Title Jul-10 Aug-10 Sep-10 Oct-10 Nov-10 Dec-10 Jan-11 Feb-11 Mar-11 Apr-11 May-11 Jun-11
--------------------------------------------------------------------------------------------
A Null M1 Null M2 Null Null Null Null M3 Null Null Null
B Null M1 Null Null Null Null M2 Null Null Null Null Null
C Null Null Null Null Null M1 Null Null Null Null Null Null如何仅选择某个范围内的列。
For instance if input variables are:
-------------------------------------
@start = 'Oct-10'
@end = 'Apr-11'则输出将为:
Title Oct-10 Nov-10 Dec-10 Jan-11 Feb-11 Mar-11 Apr-11
-----------------------------------------------------------------
A M2 Null Null Null Null M3 Null
B Null Null Null M2 Null Null Null
C Null Null M1 Null Null Null Null发布于 2010-06-19 06:44:33
使用一个名为pivot_query (code is here,examples here )的方便的存储过程,可以更容易地完成透视。这样,您可以使用开始和结束日期条件首先限制要透视的数据,从而限制在透视之后获得的列。
fn_MonthRange() function是一个递归的CTE,它提供了开始日期和结束日期之间相隔一个月的日期表,然后将其外部连接到您的数据。这将填补任何缺失的月份。
(fn_DateRange()类似,但适用于任意时间段,如“每15分钟”、每小时、每3天等)
create table #testdata
(
id integer,
Title varchar(20),
TheDate datetime,
Metadata varchar(20)
)
go
insert into #testdata values(1,'A','08/01/2010','M1')
insert into #testdata values(1,'A','10/05/2010','M2')
insert into #testdata values(1,'A','03/15/2011','M3')
insert into #testdata values(2,'B','09/20/2010','M1')
insert into #testdata values(2,'B','01/15/2011','M2')
insert into #testdata values(3,'C','12/15/2010','M1')
go
declare @mySQL varchar(MAX);
declare @StartDate varchar(20);
declare @EndDate varchar(20);
set @StartDate = '08/01/2010';
set @EndDate = '03/15/2011';
set @mySQL = '
select
id,
Title,
Left(Datename(month, TheDate),3) + ''-'' + right(cast(Year(theDate) as varchar(4)),2) monyr,
Metadata
from
dbo.fn_MonthRange( ''' + @StartDate + ''',''' + @EndDate + ''') dr
LEFT OUTER JOIN #testdata td
on (td.TheDate between dr.startdate and dr.enddate )
where
dr.StartDate between ''' + @StartDate + ''' and ''' + @EndDate + '''';
exec pivot_query @mySQL, 'Title', 'monyr','max(Metadata)'
go
Result:
Title Aug-10 Dec-10 Feb-11 Jan-11 Mar-11 Nov-10 Oct-10 Sep-10
-------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
A M1 NULL NULL NULL M3 NULL M2 NULL
B NULL NULL NULL M2 NULL NULL NULL M1
C NULL M1 NULL NULL NULL NULL NULL NULL
None NULL NULL None NULL NULL None NULL NULL 发布于 2010-06-19 05:37:36
这是应用程序比SQl更有意义的事情。执行以下操作:
select field1, field2 from your table between date1 and date2. 然后让应用程序透视数据。通常,应用程序可以比SQL更有效地透视数据。特别是当你每次运行它的时候列数都不一样的时候。
发布于 2010-06-19 04:53:48
它看起来像是旋转的表,我的意思是列可能应该是行。这种类型的设计非常具有人类可读性,但不是很容易查询。
看看UNPIVOT运算符。您应该能够使用它来获取包含行的数据集,然后在完成后,如果需要,您可以转回此格式。
这里有一篇文章:http://msdn.microsoft.com/en-us/library/ms177410.aspx
UNPIVOT通过将列旋转成行来执行几乎与PIVOT相反的操作。
https://stackoverflow.com/questions/3072964
复制相似问题