【问题标题】:Calculate last 12 Months + Sum of all transaction before last 12 months计算过去 12 个月 + 过去 12 个月之前所有交易的总和
【发布时间】:2013-09-16 07:55:31
【问题描述】:

想知道您是否可以帮助我查询?

在金融部门工作,我的sql有点生疏。我需要返回一些我们需要传输到另一个数据库的数据。

出于测试原因,我整理了下表。

我有2个账户,1个和2个,每个账户都有2年的交易记录。

我的尝试

    SELECT TOP 12 
    tt.AccountNo,
    tt.Amount,
    tt.CreatedDate,
    --Get Sum(Amount) of all transaction  before last 12 month
    Startingbalance=(SELECT sum(Amount)
                   FROM TransactionsTest tt2 
                  WHERE tt.AccountNo=tt2.AccountNo
                  AND --exclude last 12 months)
    FROM    TransactionsTest tt
    --WHERE tt.AccountNo=1
    GROUP BY tt.AccountNo,tt.Amount,tt.CreatedDate
    ORDER BY tt.CreatedDate desc

任务:

返回每个账户的最近 12 笔交易 + 每个账户必须返回一个“StartingBalance” StartingBalance=过去 12 个月前所有交易的总和(金额)。

有什么建议吗?

非常感谢

        BEGIN TRANSACTION;
    IF object_id(N'TransactionsTest', 'U') IS NOT NULL
        DROP TABLE TransactionsTest
    GO

    CREATE TABLE [dbo].[TransactionsTest](
        [Id] [int] NOT NULL,
        [AccountNo] [int] NOT NULL,
        [Amount] [decimal](18, 2) NOT NULL,
        [CreatedDate] [datetime] NOT NULL
    ) ON [PRIMARY]

    GO

    INSERT INTO [dbo].[TransactionsTest]([Id], [AccountNo], [Amount], [CreatedDate])
    SELECT 1, 1, 10.00, '20120128 00:00:00.000' UNION ALL
    SELECT 2, 1, 10.00, '20120228 00:00:00.000' UNION ALL
    SELECT 3, 1, 10.00, '20120328 00:00:00.000' UNION ALL
    SELECT 4, 1, 10.00, '20120428 00:00:00.000' UNION ALL
    SELECT 5, 1, 10.00, '20120528 00:00:00.000' UNION ALL
    SELECT 6, 1, 10.00, '20120628 00:00:00.000' UNION ALL
    SELECT 7, 1, 10.00, '20120728 00:00:00.000' UNION ALL
    SELECT 8, 1, 10.00, '20120828 00:00:00.000' UNION ALL
    SELECT 9, 1, 10.00, '20120928 00:00:00.000' UNION ALL
    SELECT 10, 1, 10.00, '20121028 00:00:00.000' UNION ALL
    SELECT 11, 1, 10.00, '20121128 00:00:00.000' UNION ALL
    SELECT 12, 1, 10.00, '20121228 00:00:00.000' UNION ALL
    SELECT 13, 1, 10.00, '20130128 00:00:00.000' UNION ALL
    SELECT 14, 1, 10.00, '20130228 00:00:00.000' UNION ALL
    SELECT 15, 1, 10.00, '20130328 00:00:00.000' UNION ALL
    SELECT 16, 1, 10.00, '20130428 00:00:00.000' UNION ALL
    SELECT 17, 1, 10.00, '20130528 00:00:00.000' UNION ALL
    SELECT 18, 1, 10.00, '20130628 00:00:00.000' UNION ALL
    SELECT 19, 1, 10.00, '20130728 00:00:00.000' UNION ALL
    SELECT 20, 1, 10.00, '20130828 00:00:00.000' UNION ALL
    SELECT 21, 1, 10.00, '20130928 00:00:00.000' UNION ALL
    SELECT 22, 1, 10.00, '20131028 00:00:00.000' UNION ALL
    SELECT 23, 1, 10.00, '20131128 00:00:00.000' UNION ALL
    SELECT 24, 1, 10.00, '20131228 00:00:00.000' UNION ALL
    SELECT 25, 2, 20.00, '20120128 00:00:00.000' UNION ALL
    SELECT 26, 2, 20.00, '20120228 00:00:00.000' UNION ALL
    SELECT 27, 2, 20.00, '20120328 00:00:00.000' UNION ALL
    SELECT 28, 2, 20.00, '20120428 00:00:00.000' UNION ALL
    SELECT 29, 2, 20.00, '20120528 00:00:00.000' UNION ALL
    SELECT 30, 2, 20.00, '20120628 00:00:00.000' UNION ALL
    SELECT 31, 2, 20.00, '20120728 00:00:00.000' UNION ALL
    SELECT 32, 2, 20.00, '20120828 00:00:00.000' UNION ALL
    SELECT 33, 2, 20.00, '20120928 00:00:00.000' UNION ALL
    SELECT 34, 2, 20.00, '20121028 00:00:00.000' UNION ALL
    SELECT 35, 2, 20.00, '20121128 00:00:00.000' UNION ALL
    SELECT 36, 2, 20.00, '20121228 00:00:00.000' UNION ALL
    SELECT 37, 2, 20.00, '20130128 00:00:00.000' UNION ALL
    SELECT 38, 2, 20.00, '20130228 00:00:00.000' UNION ALL
    SELECT 39, 2, 20.00, '20130328 00:00:00.000' UNION ALL
    SELECT 40, 2, 20.00, '20130428 00:00:00.000' UNION ALL
    SELECT 41, 2, 20.00, '20130528 00:00:00.000' UNION ALL
    SELECT 42, 2, 20.00, '20130628 00:00:00.000' UNION ALL
    SELECT 43, 2, 20.00, '20130728 00:00:00.000' UNION ALL
    SELECT 44, 2, 20.00, '20130828 00:00:00.000' UNION ALL
    SELECT 45, 2, 20.00, '20130928 00:00:00.000' UNION ALL
    SELECT 46, 2, 20.00, '20131028 00:00:00.000' UNION ALL
    SELECT 47, 2, 20.00, '20131128 00:00:00.000' UNION ALL
    SELECT 48, 2, 20.00, '20131228 00:00:00.000'
    COMMIT;

【问题讨论】:

  • 是的。我已经尝试更新了这个问题。我在计算起始余额时遇到了问题。
  • 为什么投反对票!!
  • 几乎我错过了最后一点,如何排除过去 12 个月。有人可以帮忙。我已经更新了问题
  • 我认为您的问题需要重新表述。要么你想要 12 行 + 所有其他行的总和,要么你想要 12 个月 + 12 个月之前的所有总和。我也没有你的输出格式。你在每一行中都需要这个总和吗?或者您可能想要第 13 行,其中包含 12 个月之前的所有交易的总和?
  • @RomanPekar 很抱歉不清楚。我想为每个帐户输出最后 12 行(CreatedDate desc),包括一个额外的列,该列是 12 个月前所有交易的总和)或您可能建议的“返回13行,由最后12行+第13行加上12个月前所有交易的总和组成。是不是更清楚?

标签: sql sql-server-2005


【解决方案1】:
with cte as (
    select
        row_number() over(partition by AccountNo order by CreatedDate desc) as rn,
        AccountNo, Amount, CreatedDate
    from TransactionsTest
), cte2 as (
    select
        c.AccountNo, c.CreatedDate, c.Amount, 0 as Ord
    from cte as c
    where rn <= 12
    union all
    select
        c.AccountNo, null as CreatedDate, sum(c.Amount) as Amount, 1 as Ord
    from cte as c
    where rn > 12
    group by c.AccountNo
)
select
    AccountNo, CreatedDate, Amount
from cte2
order by AccountNo, Ord, CreatedDate

sql fiddle demo

【讨论】:

  • 效果很好。这正是我想要的。一个问题是 row_number 与 sql 2005 兼容。我的笔记本电脑上现在有 2008,但在工作中将是 sql 2005。
  • @RomanPekar.I 正在重新阅读你写的查询,你能解释一下“0 as Ord”和“1 as Ord”对我意味着什么吗?非常感谢
  • @user231465 这是一个额外的列,可以帮助总行排在所有带日期的行之后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多