Sql server 如何找到包括当前金额在内的一年以前金额的总和
我需要得到第二个条目的当前金额与该特定年份的前一金额之和 输入表Sql server 如何找到包括当前金额在内的一年以前金额的总和,sql-server,sum,Sql Server,Sum,我需要得到第二个条目的当前金额与该特定年份的前一金额之和 输入表 +-----------+----------+-------------+-----------+----------+ | ID | Name | Date1 |Date 2 |amount | +-----------+----------+-------------+-----------+----------+ | 10000000 | ABC | 11/2/2
+-----------+----------+-------------+-----------+----------+
| 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个记录金额。我在这里做了一些相当大的假设。主要是,您希望查看当前记录的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;
理想情况下,查询表有一个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-但显示的值看起来不正确。对吗?如果是的话,你是如何得出这个数字的?ID和Name的值是否相关?如果第2行中任一行的值不同,您是否仍要求和?记录1金额-2504+0 2017年没有以前的记录记录记录2金额为2504+-2174=329,因为日期1为2017年。事实上,我需要2017年当前和以前的金额总和,谢谢你的回复,但如果记录的日期2相同,我需要记录的当前和以前的金额总和。假设我们有3条相同日期2值的记录。那么第一条记录应该有它的实际金额值,第二条记录应该有第一条记录金额+2条记录金额,第三条记录应该有第一条记录金额+2条记录金额+3条记录金额。希望这是清楚的。再次感谢你的帮助
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;