2017-06-15 63 views
0

使用SQL Server 2016,我有以下示例数据:T-SQL查询 - 聚集

Date  Total_Req. Changed  Deleted  New 
    9/16/2008 271   7   1   3 
    10/14/2008 235   1   10   11 
    10/15/2008 131   2   3   5 
    11/21/2009 190   4   5   2 
    11/22/2009 125   5   12   1 
    11/23/2009 181   6   1   4 
    4/13/2011 300   8   2   8 
    4/26/2011 281   11   7   9 
    4/26/2011 302    5   8   10 

我可以很容易地使用像每月汇总:

Select cast(Format([Date], 'MM/01/yyyy') as date) as [Date], 
    SUM([Changed]) as [Changed], SUM([Deleted]) as [Deleted], SUM([New]) as 
    [New] GRPUP BY Format([Date], 'MM/01/yyyy') 

到目前为止好我每月得到一笔:

Date  Changed Deleted New 
    9/1/2008 7   1 3 
    10/1/2008 3   13 16 
    11/1/2009 15  18 7 
    4/1/2011 19   9 17 

不过,我需要在查询中包括总价值_REQ在一个月,则最后日期,这样所需的输出将是:

Date Total Req. Changed Deleted New 
    9/1/2008 271  7  1  3 
    10/1/2008 131  3  13 16 
    11/1/2009 181  15 18  7 
    4/1/2011 302  19 9  17 

我怎样才能做到这一点?

谢谢, M.R.

回答

2

单从SELECT子句中运行一个子查询回到原来的表背到原始表:

SELECT cast(Format([Date], 'MM/01/yyyy') as date) as [Date], 
    (SELECT TOP 1 [Total_Req.] FROM [MyTable] t0 WHERE Format(t0.[Date], 'MM/01/yyyy') = Format(t.[Date], 'MM/01/yyyy') ORDER BY t0.[Date] DESC) as [Total_Req.], 
    SUM([Changed]) as [Changed], SUM([Deleted]) as [Deleted], SUM([New]) as [New] 
FROM [MyTable] t 
GROUP BY Format([Date], 'MM/01/yyyy') 

SELECT cast(Format([Date], 'MM/01/yyyy') as date) as [Date], 
    MIN(t1.[Total_Req.]) As [Total_Req.], 
    SUM([Changed]) as [Changed], SUM([Deleted]) as [Deleted], SUM([New]) as [New] 
FROM [MyTable] t 
CROSS APPLY (SELECT TOP 1 [Total_Req.] FROM [MyTable] t0 WHERE Format(t0.[Date], 'MM/01/yyyy') = Format(t.[Date], 'MM/01/yyyy') ORDER BY t0.[Date] DESC) t1 
GROUP BY Format([Date], 'MM/01/yyyy') 

如果你真的需要更快的结果,看一看的FORMAT([Date], 'MM/01/yyyy')表达。这个表达式切入这个查询的核心,因为它以三种不同的方式使用,包括子查询或APPLY的匹配条件。该表达式也是不可sargeable,这意味着不管你有什么索引,它们都不会帮你处理需要这个值的查询元素。

如果添加计算列表中的这个表达式,你就可以在索引中使用新列,你应该得到更快的结果。

+0

感谢乔尔,它的工作原理,但对于一个表55000记录是不是非常有效.... –

+0

55,000记录是花生。我也有CROSS APPLY的版本,但我不知道这是否会更快。 –

+0

我添加了所有索引,但需要大约3分钟才能执行,很奇怪... –

2

只需使用一个相关子查询的总所需物品列中,选择所述总所需物品其中日期是用于在外部查询的行的月份的MAX(日期)。 (或在子查询中使用TOP 1按日期排序)。