Как найти сумму предыдущих сумм за год, включая текущую сумму - PullRequest
0 голосов
/ 09 июля 2019

Мне нужно получить сумму текущего с предыдущим количеством этого конкретного года для 2-й записи.

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-ю сумму записи + 2-ую сумму записи + 3-ю сумму записи.

1 Ответ

1 голос
/ 10 июля 2019

Я сделал несколько значительных предположений здесь. Главным образом, вы хотите увидеть, существует ли значение «Date2» текущей записи где-то в «Date1» за предыдущий год (например, Date2: 11/02/2018 ищет, существует ли Date1: 11/02/2017) и что * Столбцы 1001 * ID и Имя имеют определенную значимость при фильтрации данных.

Вот что я работал в 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 (уникальный идентификатор):

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;

В любом случае, это мое лучшее предположение, основанное на том небольшом количестве информации, которое мне приходилось распространять. Надеюсь, это поможет вам двигаться в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...