一尘不染

在事件表和日期范围之间的T-SQL查询

sql

根据下表

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

阅读 148

收藏
2021-03-08

共1个答案

一尘不染

您要查找的内容通常称为交叉表查询。如果您要问的是如何在给定 静态 列列表的情况下构建交叉表查询,则可以执行以下操作:

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是 可能的
,但它既脆弱又麻烦。相反,您应该在中间层组件中构建结果集,或者使用将生成交叉表结果的报告工具。

2021-03-08