2013-06-25 88 views
0

我有一个关于在SQL Server 2008 R2中的现有查询上创建运行总数的问题。SQL查询的SUM子集

基本上,我有从3个独立的表和组将它们组合的数据以产生用于的ACCOUNTPROFITCENTRETIMEIDDIVISION

每个组合中的单个条目。然而的查询时,我需要改变在SIGNEDDATA值,每个条目都是前几个月的总和。

例如

  • TIMEID 20120300(2012年3月)将包含-35143.0000000000
  • TIMEID 20120400(2012年4月),则应当包含-36000.0000000000(三月加上-857四月)
  • TIMEID 20120500(2012年5月)应-36857.0000000000等,

而不是我目前得到的,这是SIGNEDDATA每个月的总和,通过ACCOUNT, PROFITCENTRE, DIVISION分组等,但不添加到先前的蒙HS。

我该如何做,因为我试图从GROUP BY子句中删除TIMEID,但我只是得到了不能检索列的常见错误,因为它不包含在聚合或Group by中。 ....?

我的选择如下:

Insert INTO Data_Services.dbo.[NEW_TABLE] 
Select 
[Account], 
[Category], 
[DataSrc], 
[ProfitCentre], 
'MY_FLOW' as [Flow], 
[RptCurrency], 
[TimeID], 
sum(round([SignedData],2,0)) as SignedData, 
[Division], 
@CurrentTime as CTimeID 
FROM 
(select 
    T1.[Account], 
    T1.[Category], 
    T1.[DataSrc], 
    T1.[ProfitCentre], 
    T1.[Flow], 
    T1.[RptCurrency], 
    T1.[TimeID], 
    sum(round(T1.[SignedData],2,0)) as SignedData, 
    mbrPC.[Division] 
from 
     MY_DATABASE.dbo.TABLE1 T1 
    join 
     MY_DATABASE.dbo.mbrProfitCentre mbrPC on T1.ProfitCentre = mbrPC.[ID] 
where 
     T1.Category = 'WForecast' 
     and T1.DataSrc in (SELECT [ID] from DSParent) 
     and T1.Flow = 'MOVEMENT' 
     and T1.Account in 
      (SELECT [ID] from AccIEParent) 
     and TimeID in 
     (select [TimeID] from MY_DATABASE.dbo.mbrTime 
     where [Period_Start] <> '' 
     and [Period_Start] is not null 
     and convert(date,[Period_Start],101) <= '2013-01-24' 
     and [CURRYEAR] = 'Y') 

group by T1.[Account], 
     T1.[Category], 
     T1.[DataSrc], 
     T1.[ProfitCentre], 
     T1.[Flow], 
     T1.[RptCurrency], 
     T1.[TimeID], 
     mbrPC.[Division] 

UNION 

select 
    T2.[Account], 
    T2.[Category], 
    T2.[DataSrc], 
    T2.[ProfitCentre], 
    T2.[Flow], 
    T2.[RptCurrency], 
    T2.[TimeID], 
    sum(round(T2.[SignedData],2,0)) as SignedData, 
    mbrPC.[Division] 

from MY_DATABASE.dbo.TABLE2 T2 
    join MY_DATABASE.dbo.mbrProfitCentre mbrPC 
     on T2.ProfitCentre = mbrPC.[ID] 


where T2.Category = 'WForecast' 
    and T2.DataSrc in 
      (SELECT [ID] from DSParent) 
    and T2.Flow = 'MOVEMENT' 
    and T2.Account in 
      (SELECT [ID] from AccIEParent) 
    and TimeID in 
     (select [TimeID] from MY_DATABASE.dbo.mbrTime 
     where [Period_Start] <> '' 
     and [Period_Start] is not null 
     and convert(date,[Period_Start],101) <= '2013-01-24' 
     and [CURRYEAR] = 'Y') 

group by T2.[Account], 
     T2.[Category], 
     T2.[DataSrc], 
     T2.[ProfitCentre], 
     T2.[Flow], 
     T2.[RptCurrency], 
     T2.[TimeID], 
     mbrPC.[Division] 

UNION 

select 
    T3.[Account], 
    T3.[Category], 
    T3.[DataSrc], 
    T3.[ProfitCentre], 
    T3.[Flow], 
    T3.[RptCurrency], 
    T3.[TimeID], 
    sum(round(T3.[SignedData],2,0)) as SignedData, 
    mbrPC.[Division] 

from MY_DATABASE.dbo.TABLE3 T3 
    join MY_DATABASE.dbo.mbrProfitCentre mbrPC 
     on T3.ProfitCentre = mbrPC.[ID] 

where T3.Category = 'WForecast' 
    and T3.DataSrc in 
      (SELECT [ID] from DSParent) 
    and T3.Flow = 'MOVEMENT' 
    and T3.Account in 
      (SELECT [ID] from AccIEParent) 
    and TimeID in 
     (select [TimeID] from MY_DATABASE.dbo.mbrTime 
     where [Period_Start] <> '' 
     and [Period_Start] is not null 
     and convert(date,[Period_Start],101) <= '2013-01-24' 
     and [CURRYEAR] = 'Y') 

group by T3.[Account], 
     T3.[Category], 
     T3.[DataSrc], 
     T3.[ProfitCentre], 
     T3.[Flow], 
     T3.[RptCurrency], 
     T3.[TimeID], 
     mbrPC.[Division] 
) a 

group by [Account], 
     [Category], 
     [DataSrc], 
     [ProfitCentre], 
     [Flow], 
     [RptCurrency], 
     [TimeID], 
     [Division] 

,并将所得数据集是:

enter image description here

回答

0

什么你想要做的是略高于这个例子更复杂门票,但这里有各种方法来计算累计金额。

how to get cumulative sum

+0

谢谢贾斯汀。我能够使用登台表汇总一次数据,然后使用您建议的帖子中的信息创建累计总数。也许不是最简单的方式,但因为它只需要4秒,而且每天只有一次,所以没关系。 –