2017-06-15 65 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按日期排序)。