首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >t-sql在事件表和日期范围之间的查询

t-sql在事件表和日期范围之间的查询
EN

Stack Overflow用户
提问于 2010-06-19 01:23:09
回答 2查看 189关注 0票数 3

基于下表

代码语言:javascript
复制
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

输入变量将是开始日期和结束日期。举个例子,

代码语言:javascript
复制
@startDate = '07/01/2010' 
@endDate = '06/30/2011'

如何生成以下输出?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-19 01:43:22

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

代码语言:javascript
复制
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

类似地,您可以按照断开的链接所建议的那样使用透视功能。但是,上面的解决方案和PIVOT功能都依赖于静态列声明。如果您想要的是列的动态列表(也称为动态交叉表),那么您就超出了T-SQL的设计初衷。对于一些笨拙的动态SQL来说,这是可能的,但它很脆弱和笨重。相反,您应该在中间层组件中构建结果集,或者使用将构建交叉表结果的报告工具。

票数 3
EN

Stack Overflow用户

发布于 2010-06-19 01:27:33

使用Pivot表..

一个简单的例子..

代码语言:javascript
复制
    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 

查询

代码语言:javascript
复制
    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;  

结果

代码语言:javascript
复制
Cost_Sorted_By_Production_Days   0                     1                     2                     3                     4

AverageCost                    5.0885                223.88                359.1082              NULL                  949.4105
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3071799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档