Получите тот же квартальный доход с предыдущего года - PullRequest
0 голосов
/ 24 октября 2019

У меня есть набор данных, который делится на отдел, финансовый год, финансовый квартал и, наконец, общую сумму, как показано ниже.

+---------------------------------+------------+---------------+-------------+
|            Department           | FISCALYEAR | FISCALQUARTER | TotalAmount |
+---------------------------------+------------+---------------+-------------+
| Internal Medicine - Dermatology |       2018 |             2 | 50.00       |
| Internal Medicine - Dermatology |       2018 |             4 | 75.00       |
| Internal Medicine - Dermatology |       2019 |             1 | 135.00      |
| Internal Medicine - Dermatology |       2019 |             2 | 75.00       |
| Internal Medicine - Dermatology |       2019 |             3 | 185.00      |
| Internal Medicine - Dermatology |       2019 |             4 | 84.00       |
| Internal Medicine - Dermatology |       2020 |             1 | 85.00       |
| Internal Medicine - Dermatology |       2020 |             2 | 10.00       |
+---------------------------------+------------+---------------+-------------+

Как добавить столбец, чтобы получить общую суммус предыдущего года / квартала? Например, финансовый год 2020, финансовый квартал 2 покажет 75,00.

Сложность в том, что в некоторых кварталах нет данных, поэтому есть пробелы.

Я пытался использовать оконную функцию LAG (), но у меня возникают трудности при определении смещения, поскольку ононе является стандартным смещением.

Любая помощь / идеи будут великолепны.

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Как насчет этого ?

IF OBJECT_ID('tempdb.dbo.#YourTable', 'U') IS NOT NULL DROP TABLE #YourTable; 

CREATE TABLE #YourTable(
   Department    VARCHAR(33) NOT NULL
  ,FISCALYEAR    INTEGER  NOT NULL
  ,FISCALQUARTER INTEGER  NOT NULL
  ,TotalAmount   NUMERIC(7,2) NOT NULL
);

INSERT INTO #YourTable(Department,FISCALYEAR,FISCALQUARTER,TotalAmount) VALUES ('Internal Medicine - Dermatology',2018,2,50.00);
INSERT INTO #YourTable(Department,FISCALYEAR,FISCALQUARTER,TotalAmount) VALUES ('Internal Medicine - Dermatology',2018,4,75.00);
INSERT INTO #YourTable(Department,FISCALYEAR,FISCALQUARTER,TotalAmount) VALUES ('Internal Medicine - Dermatology',2019,1,135.00);
INSERT INTO #YourTable(Department,FISCALYEAR,FISCALQUARTER,TotalAmount) VALUES ('Internal Medicine - Dermatology',2019,2,75.00);
INSERT INTO #YourTable(Department,FISCALYEAR,FISCALQUARTER,TotalAmount) VALUES ('Internal Medicine - Dermatology',2019,3,185.00);
INSERT INTO #YourTable(Department,FISCALYEAR,FISCALQUARTER,TotalAmount) VALUES ('Internal Medicine - Dermatology',2019,4,84.00);
INSERT INTO #YourTable(Department,FISCALYEAR,FISCALQUARTER,TotalAmount) VALUES ('Internal Medicine - Dermatology',2020,1,85.00);
INSERT INTO #YourTable(Department,FISCALYEAR,FISCALQUARTER,TotalAmount) VALUES ('Internal Medicine - Dermatology',2020,2,10.00);

SELECT a.Department, a.FISCALYEAR, a.FISCALQUARTER, 
       a.TotalAmount, b.TotalAmount AS PriorYearQuarterTotalAmount
FROM #YourTable a
LEFT JOIN #YourTable b ON a.Department = b.Department
                     AND a.FISCALYEAR - 1 = b.FISCALYEAR
                     AND a.FISCALQUARTER = b.FISCALQUARTER
0 голосов
/ 24 октября 2019

Предполагая, что у вас есть данные за каждый год, используйте оконные функции:

SELECT a.Department, a.FISCALYEAR, a.FISCALQUARTER, 
       a.TotalAmount,
       LAG(a.TotalAmount) OVER (PARTITION BY a.Department, a.FISCALQUARTER ORDER BY a.FISCALYEAR) AS PriorYearQuarterTotalAmount
FROM a;

Оконные функции обычно приводят к самым быстрым запросам и являются более краткими, чем альтернативы.

0 голосов
/ 24 октября 2019

Вы можете использовать встроенный запрос:

select 
    t.*,
    (
        select t1.TotalAmount 
        from mytable t1 
        where t1.FiscalQuarter = t.FiscalQuarter and t1.FiscalYear = t.FiscalYear - 1
    ) lastTotalAmount
from mytable t
...