代码之家  ›  专栏  ›  技术社区  ›  stackoverflowuser

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

  •  3
  • stackoverflowuser  · 技术社区  · 15 年前

    根据下表

    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
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   Thomas    15 年前

    您正在寻找的通常称为交叉表查询。如果您要问的是如何在给定的 静止的 列列表,您可以这样做:

    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
    

    同样,您可以使用断开链接建议的透视功能。但是,上述解决方案和透视功能都依赖于 静止的 列声明。如果您想要的是列的动态列表(也就是动态交叉表),那么您就超出了T-SQL最初设计的范围。它是 可能的 有一些不稳定的动态SQL,但它又脆弱又笨重。相反,您应该在中间层组件中构建结果集,或者使用将构建交叉表结果的报告工具。

        2
  •  2
  •   Broken Link    15 年前

    使用 Pivot 桌子。。

    一个简单的例子……

        USE AdventureWorks;
    GO
    
    SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost 
    FROM Production.Product
    GROUP BY DaysToManufacture; 
    
    
    
    DaysToManufacture  AverageCost  
    0                  5.0885  
    1                  223.88  
    2                  359.1082  
    4                  949.4105 
    

    查询

        SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days,   
    [0], [1], [2], [3], [4]  
    FROM  
    (SELECT DaysToManufacture, StandardCost   
        FROM Production.Product) AS SourceTable  
    PIVOT  
    (  
    AVG(StandardCost)  
    FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) 
    ) AS PivotTable;  
    

    结果

    Cost_Sorted_By_Production_Days   0                     1                     2                     3                     4
    
    AverageCost                    5.0885                223.88                359.1082              NULL                  949.4105
    
    推荐文章