1

我已经为这个问题发疯了一段时间,我正在寻求帮助。

我有带有值的 SQL Server 表,如下所示:

Account - Date - Amount - Summary 
10000 - 2010-1-1 - 50.00 - 0.00 
10000 - 2010-2-1 - 50.00 - 0.00 
10000 - 2010-3-1 - 50.00 - 0.00 
10000 - 2010-4-1 - 50.00 - 0.00 
10000 - 2010-5-1 - 50.00 - 0.00 
10000 - 2010-6-1 - 50.00 - 0.00 
10000 - 2010-7-1 - 50.00 - 0.00 
10000 - 2010-8-1 - 50.00 - 0.00 
10000 - 2010-9-1 - 50.00 - 0.00 
10000 - 2010-10-1 - 50.00 - 0.00 
10000 - 2010-11-1 - 50.00 - 0.00 
10000 - 2010-12-1 - 50.00 - 600.00 
10000 - 2011-1-1 - 25.00 - 0.00
10000 - 2011-2-1 - 25.00 - 0.00
10000 - 2011-3-1 - 50.00 - 0.00
10000 - 2011-4-1 - 50.00 - 0.00
10000 - 2011-5-1 - 50.00 - 0.00
10000 - 2011-12-1 - 25.00 - 825.00
10000 - 2012-1-1 - 100.00 - 0.00
10000 - 2012-2-1 - 200.00 - 0.00
10000 - 2012-3-1 - 100.00 - 0.00
10000 - 2012-5-1 - 100.00 - 0.00
10000 - 2012-6-1 - 100.00 - 0.00
10000 - 2012-8-1 - 100.00 - 0.00
10000 - 2012-12-1 - 100.00 - 1625.00
10001 - 2010-1-1 - 50.00 - 0.00 
10001 - 2010-2-1 - 60.00 - 0.00 
10001 - 2010-12-1 - 60.00 - 170.00 
10001 - 2011-1-1 - 50.00 - 0.00
10001 - 2011-2-1 - 50.00 - 0.00
10001 - 2011-3-1 - 50.00 - 0.00
10001 - 2011-4-1 - 50.00 - 0.00
10001 - 2011-6-1 - 50.00 - 0.00
10001 - 2011-8-1 - 50.00 - 0.00
10001 - 2011-10-1 - 50.00 - 0.00
10001 - 2011-12-1 - 50.00 - 570.00

这是表的基本快照。“摘要”列给出了年底“金额”的总数(基于“日期”列),但仅当 MONTH(Date) = '12' 时。数百个帐户都以这种方式进行,大约还有 4 年的时间。我想在这个现有表中添加一列,名为“SummaryPreviousYear”。SummaryPreviousYear 列应包含 MONTH(Date) = '12' 和上一年的金额之和。我想在帐号上加入此列,以便它位于摘要列旁边并提供一个值,就像摘要值一样,但 SummaryPreviousYear 值需要在整个列中出现,而不是就在月份是 12 的地方。例如,以下行:

前:

Account - Date - Amount - Summary 
10001 - 2011-10-1 - 50.00 - 0.00
10001 - 2011-12-1 - 50.00 - 570.00

后:

Account - Date - Amount - Summary - SummaryPreviousYear
10001 - 2011-10-1 - 50.00 - 0.00 - 170.00
10001 - 2011-12-1 - 50.00 - 570.00 - 170.00

谁能帮我这个?我在这里拉了两天的头发,需要创建这个数据集,这样我才能继续我的报告开发。不幸的是,DBA 不在现场。从字面上看,我无能为力。任何帮助将不胜感激。

4

3 回答 3

1

为什么要为数据库中的每一行复制此摘要和上一年的摘要数据?这是浪费和不必要的。最好有另一个包含前一年摘要的表,每年一行,您可以加入到该表中。而且,我认为根本不需要摘要列。为什么不创建一个在月份为 12 时计算摘要的视图,并为任何不等于 12 的月份返回零。

于 2012-08-10T20:12:36.773 回答
0
SELECT 
    t.Account,
    t.Date,
    t.Amount,
    t.Summary,
    s.Summary as SummaryPreviousYear
FROM TestTable t    
JOIN (
    SELECT
        Account,
        DATEPART(YEAR, Date) as Year,
        SUM(Amount) as Summary
    FROM TestTable
    GROUP BY Account, DATEPART(YEAR, Date)
) s
    ON s.Account = t.Account
    AND s.Year = DATEPART(YEAR, Date) - 1
于 2012-08-10T20:13:31.500 回答
0
SELECT    l.*, 
          q.summary AS SummaryPreviousYear
FROM      lists l
LEFT JOIN 
     (
          SELECT    Date, 
                    Summary
          FROM      lists 
          WHERE     MONTH(Date) = 12
     ) AS q  
          ON YEAR(l.Date) = YEAR(q.Date) + 1
于 2012-08-10T20:18:20.680 回答