如何找到包括当前金额在内的一年的先前金额的总和

Posted

技术标签:

【中文标题】如何找到包括当前金额在内的一年的先前金额的总和【英文标题】:How to find the sum of prior amounts for an year including the current amount 【发布时间】:2019-07-09 16:05:57 【问题描述】:

我需要获取第二个条目的当前金额与该特定年份的先前金额的总和。

输入表

+-----------+----------+-------------+-----------+----------+
| ID        | Name     | Date1       |Date 2     |amount    |
+-----------+----------+-------------+-----------+----------+
| 10000000  | ABC      | 11/2/2017   |**11/2/2018**  |2504      |
| 10000000  | ABC      | 12/20/2017  |**11/2/2018**  |-2174     |
| 10000000  | ABC      | 10/05/2018  |10/05/2019 |1234      |
| 10000000  | ABC      | 10/06/2019  |10/06/2020 |3456      |
+-----------+----------+-------------+-----------+----------+

这是所需的输出:

+-----------+----------+-------------+-----------+----------+
| ID        | Name     | Date1       |Date 2     |amount    |
+-----------+----------+-------------+-----------+----------+
| 10000000  | ABC      | 11/2/2017   |**11/2/2018**  |2504      |
| 10000000  | ABC      | 12/20/2017  |**11/2/2018**  |329       |
| 10000000  | ABC      | 10/05/2018  |10/05/2019 |1234      |
| 10000000  | ABC      | 10/06/2019  |10/06/2020 |3456      |
+-----------+----------+-------------+-----------+----------+

记录 3 数量 - 1234 (1234+0(当年没有记录)) 因为日期 2 不同

记录 4 数量 - 3456 (3456+0(当年没有记录)) 因为日期 2 不同

如果两条记录的日期 2 相同,我正在寻找一条记录的当前、先前金额值的总和。假设我们有 3 条具有相同日期 2 值的记录。那么第一个记录应该有它的实际金额值,第二个记录应该有第一个记录金额+2个记录金额,3个记录应该有第一个记录金额+2个记录金额+3个记录金额。

【问题讨论】:

记录 2 已更改 - 但显示的值看起来不正确。这是正确的吗?如果是这样,您是如何得出这个数字的? ID 和 Name 的值是否相关?如果第 2 行的值不同,您还想求和吗? 记录 1 数量 - 2504 +0(2017 年没有以前的记录)记录 2 数量为 2504+(-2174) = 329,因为日期 1 的年份是 2017。实际上我需要当前和以前的总和该学期的金额(2017 年) 【参考方案1】:

我在这里做了一些相当大的假设。主要是,您想查看当前记录的“Date2”值是否存在于上一年的“Date1”中(例如,Date2: 11/02/2018 正在查看 Date1: 11/02/2017 是否存在)并且 ID 和 Name 列在过滤数据时具有某种相关性。

这是我在 SSMS 中使用的内容:

-- Create sample data.

DECLARE @Data TABLE (
    ID VARCHAR(10), [Name] VARCHAR(3), Date1 DATE, Date2 DATE, Amount DECIMAL(18,2)
);

INSERT INTO @Data ( ID, [Name], Date1, Date2, Amount ) VALUES
( '10000000', 'ABC', '11/2/2017', '11/2/2018',  2504),
( '10000000', 'ABC', '12/20/2017', '11/2/2018',  -2174),
( '10000000', 'ABC', '10/05/2018', '10/05/2019',  1234),
( '10000000', 'ABC', '10/06/2019', '10/06/2020',  3456);

-- Query sample data

SELECT
    MyData.ID, MyData.[Name], MyData.Date1, MyData.Date2, MyData.Amount
    , ISNULL( LastYear.Amount, 0 ) AS PreviousYear
    , ( MyData.Amount + ISNULL( LastYear.Amount, 0 ) ) AS NewAmount
FROM @Data AS MyData
OUTER APPLY (

    SELECT
        SubData.Amount AS Amount
    FROM @Data AS SubData
    WHERE
        SubData.ID = MyData.ID
        AND SubData.[Name] = MyData.[Name]
        AND SubData.Date1 = DATEADD( yy, -1, MyData.Date2 )
        AND SubData.Date1 <> MyData.Date1   -- A weak attempt to exclude the current MyData record. Really needs a unique id.

) AS LastYear
ORDER BY
    MyData.Date2;

-- 返回

+----------+------+------------+------------+----------+--------------+-----------+
|    ID    | Name |   Date1    |   Date2    |  Amount  | PreviousYear | NewAmount |
+----------+------+------------+------------+----------+--------------+-----------+
| 10000000 | ABC  | 2017-11-02 | 2018-11-02 | 2504.00  | 0.00         | 2504.00   |
| 10000000 | ABC  | 2017-12-20 | 2018-11-02 | -2174.00 | 2504.00      | 330.00    |
| 10000000 | ABC  | 2018-10-05 | 2019-10-05 | 1234.00  | 0.00         | 1234.00   |
| 10000000 | ABC  | 2019-10-06 | 2020-10-06 | 3456.00  | 0.00         | 3456.00   |
+----------+------+------------+------------+----------+--------------+-----------+

理想情况下,查询表有一个 PK 可用于排除当前记录被包含(注意使用 Date1 的弱尝试)。

使用 PK(唯一 id)的相同示例:

DECLARE @Data TABLE (
    ID VARCHAR(10), [Name] VARCHAR(3), Date1 DATE, Date2 DATE, Amount DECIMAL(18,2), pk_PrimaryKey INT IDENTITY(1,1) PRIMARY KEY
);

INSERT INTO @Data ( ID, [Name], Date1, Date2, Amount ) VALUES
( '10000000', 'ABC', '11/2/2017', '11/2/2018',  2504),
( '10000000', 'ABC', '12/20/2017', '11/2/2018',  -2174),
( '10000000', 'ABC', '10/05/2018', '10/05/2019',  1234),
( '10000000', 'ABC', '10/06/2019', '10/06/2020',  3456);

SELECT
    MyData.ID, MyData.[Name], MyData.Date1, MyData.Date2, MyData.Amount
    , ISNULL( LastYear.Amount, 0 ) AS PreviousYear
    , ( MyData.Amount + ISNULL( LastYear.Amount, 0 ) ) AS NewAmount
FROM @Data AS MyData
OUTER APPLY (

    SELECT
        SubData.Amount AS Amount
    FROM @Data AS SubData
    WHERE
        SubData.ID = MyData.ID
        AND SubData.[Name] = MyData.[Name]
        AND SubData.Date1 = DATEADD( yy, -1, MyData.Date2 )
        AND SubData.pk_PrimaryKey <> MyData.pk_PrimaryKey

) AS LastYear
ORDER BY
    MyData.Date1;

无论如何,这是我根据我必须继续了解的少量信息得出的最佳猜测。希望这可以让您朝着正确的方向前进。

【讨论】:

感谢您的回复,但如果记录的日期 2 相同,我正在寻找记录的当前、先前金额值的总和。假设我们有 3 条具有相同日期 2 值的记录。那么第一个记录应该有它的实际金额值,第二个记录应该有第一个记录金额+ 2个记录金额,3个记录应该有第一个记录金额+2个记录金额+3个记录金额。希望这很清楚。再次感谢您的帮助

以上是关于如何找到包括当前金额在内的一年的先前金额的总和的主要内容,如果未能解决你的问题,请参考以下文章

SQL 怎么按时间汇总累计金额

计算一个账户所有交易金额总和的有效方法

将上个月的总金额与当前月份的结果进行比较

如何在Java中获取与01/01不同的日期开始的一年的上一个/当前季度和年份的开始和结束日期

如何用sql的日期函数,分别查出1月~12月每个月的销售金额?

找到两个日期之间的金额总和