当前位置: 首页 > 知识库问答 >
问题:

如何查找一年的先前金额的总和,包括当前金额

国高杰
2023-03-14

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

Input_table

+-----------+----------+-------------+-----------+----------+
| 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记录金额,而第三条记录应该拥有第一条记录数量2记录金额3记录金额。

共有1个答案

慕学海
2023-03-14

我在这里做了一些相当大的假设。主要是,您希望查看当前记录的“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;

不管怎样,这是我根据我所掌握的一点点信息做出的最好猜测。希望这能让你朝着正确的方向前进。

 类似资料:
  • 问题内容: iv在jqgrid中看到了@Oleg的行总和示例,但我尝试应用它,但它无法正常工作,我有以下网格,我需要为其计算金额值。 请奥列格(Oleg)帮助,我已经尝试了您的示例,但是由于某些原因它没有起作用。 问题答案: 如果我理解的正确,则希望将其放置在页脚getCol和footerData方法中: 该可用于从“量”柱,并且尊重计算所有数字的总和,你可以在底部放置列中的文本“总计:”和在底部

  • 本文向大家介绍查找最少数量的便笺以求总金额-JavaScript,包括了查找最少数量的便笺以求总金额-JavaScript的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个货币系统,其中有1000个单位,500个单位,100个单位,50个单位,20个单位,10个单位,5个单位,2个单位和1单位的面额。 在给定特定数量的情况下,我们需要编写一个函数,该函数计算总计最少的总面额。 例如,如果金额

  • 嗨,伙计们,我已经修复了最初的问题,但现在它不是正确的加起来。我不确定该做什么,哪里出了问题。如有任何帮助,我们将不胜感激。 导入java.util.scanner; public类zoo{public static void main(String[]args){

  • 我在做购物车。我能根据数量计算产品价格。 现在我计算的总额取决于小计和运费与产品价格。 当我增加产品数量时,它会计算产品价格,但不会计算小计和总金额。 或者有没有其他安全的方法来处理这个问题? 你能帮我解决这个问题吗?

  • base广州 71min 11.14 之前 金山base珠海的 二面挂了 1.uniapp为什么可以进行多端平台 2.vue2、vue3的区别? 3.vue3代理可以拦截哪些信息? 4.介绍一下html5? 5.webworkers如何把数据传到主页面? 6.浏览器的存储方式有哪些? 7.浏览器自适应布局? 8.@media可以监听哪些?除了浏览器宽高呢? 9.flex:1表示什么? 10.es6

  • 1,介绍实习,项目 2.防抖与节流的区别。 3.了解哪些排序算法。 4.vue的响应式 5.重排与重绘的区别。 6.flex有哪些属性。 7.flex-shrink使用场景。 8.反转链表如何实现,口述。