根据下表
id Title Date Metadata ------------------------------------ 1 A 08/01/2010 M1 1 A 10/05/2010 M2 1 A 03/15/2011 M3 2 B 09/20/2010 M1 2 B 01/15/2011 M2 3 C 12/15/2010 M1
输入变量将是开始日期和结束日期。例如
@startDate = '07/01/2010' @endDate = '06/30/2011'
如何生成以下输出?
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
您要查找的内容通常称为交叉表查询。如果您要问的是如何在给定 静态 列列表的情况下构建交叉表查询,则可以执行以下操作:
Select Title , Min( Case When DatePart(mm, [Date]) = 7 And DatePart(yy, [Date]) = 2010 Then MetaData End ) As [Jul-10] , Min( Case When DatePart(mm, [Date]) = 8 And DatePart(yy, [Date]) = 2010 Then MetaData End ) As [Aug-10] , Min( Case When DatePart(mm, [Date]) = 9 And DatePart(yy, [Date]) = 2010 Then MetaData End ) As [Sep-10] ... From Table Where [Date] Between @StartDate And @EndDate Group By Title
同样,您可以使用Broken Link建议的PIVOT功能。但是,以上解决方案和PIVOT功能都依赖于 静态 列声明。如果您想要的是动态列列表(又称动态交叉表),那么您将超出T-SQL最初设计的范围。某些笨拙的动态SQL是 可能的 ,但它既脆弱又麻烦。相反,您应该在中间层组件中构建结果集,或者使用将生成交叉表结果的报告工具。