首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >t-sql select查询

t-sql select查询
EN

Stack Overflow用户
提问于 2010-06-19 04:47:56
回答 5查看 321关注 0票数 1

基于下表

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

如何仅选择某个范围内的列。

代码语言:javascript
复制
For instance if input variables are:
-------------------------------------
@start = 'Oct-10'
@end = 'Apr-11'

则输出将为:

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

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-19 06:44:33

使用一个名为pivot_query (code is hereexamples here )的方便的存储过程,可以更容易地完成透视。这样,您可以使用开始和结束日期条件首先限制要透视的数据,从而限制在透视之后获得的列。

fn_MonthRange() function是一个递归的CTE,它提供了开始日期和结束日期之间相隔一个月的日期表,然后将其外部连接到您的数据。这将填补任何缺失的月份。

(fn_DateRange()类似,但适用于任意时间段,如“每15分钟”、每小时、每3天等)

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

Stack Overflow用户

发布于 2010-06-19 05:37:36

这是应用程序比SQl更有意义的事情。执行以下操作:

代码语言:javascript
复制
 select field1, field2 from your table between date1 and date2. 

然后让应用程序透视数据。通常,应用程序可以比SQL更有效地透视数据。特别是当你每次运行它的时候列数都不一样的时候。

票数 2
EN

Stack Overflow用户

发布于 2010-06-19 04:53:48

它看起来像是旋转的表,我的意思是列可能应该是行。这种类型的设计非常具有人类可读性,但不是很容易查询。

看看UNPIVOT运算符。您应该能够使用它来获取包含行的数据集,然后在完成后,如果需要,您可以转回此格式。

这里有一篇文章:http://msdn.microsoft.com/en-us/library/ms177410.aspx

UNPIVOT通过将列旋转成行来执行几乎与PIVOT相反的操作。

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

https://stackoverflow.com/questions/3072964

复制
相关文章

相似问题

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