SQL查询的和子集

SQL查询的和子集,sql,sql-server,sql-server-2008,group-by,cumulative-sum,Sql,Sql Server,Sql Server 2008,Group By,Cumulative Sum,我有一个关于在SQLServer2008R2中创建现有查询的运行总计的问题 基本上,我有一个查询,它将来自3个独立表的数据组合在一起,并对它们进行分组,为ACCOUNT、ProfitCenter、TIMEID和DIVISION的每个组合生成一个条目 但是,我需要更改SIGNEDDATA中的值,以便每个条目都是之前所有月份的总和 e、 g TIMEID 20120300 2012年3月将包含-35143.0000000000 TIMEID 20120400 2012年4月应包含-36000.000

我有一个关于在SQLServer2008R2中创建现有查询的运行总计的问题

基本上,我有一个查询,它将来自3个独立表的数据组合在一起,并对它们进行分组,为ACCOUNT、ProfitCenter、TIMEID和DIVISION的每个组合生成一个条目

但是,我需要更改SIGNEDDATA中的值,以便每个条目都是之前所有月份的总和

e、 g

TIMEID 20120300 2012年3月将包含-35143.0000000000 TIMEID 20120400 2012年4月应包含-36000.0000000000三月加上-857四月 2012年5月的时间ID 20120500应为-36857.0000000000,以此类推。, 而不是我目前得到的,即每个月的已签名数据的总和,按帐户、利润中心、部门等分组,但不添加到前几个月

我如何才能做到这一点,因为我已经尝试从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]
结果数据集为:


你想做的事情比这张票上的例子稍微复杂一点,但是这里有各种计算累计和的方法


谢谢你,贾斯汀。我能够使用一个暂存表将数据聚合一次,然后使用您建议的帖子中的信息创建累积总数。也许不是最精简的方式,但因为它只需要4秒钟,而且每天只需要一次,所以这很好。